一、测试条件; 二、if条件语句; 三、扩展; 一、条件测试:文件测试、整数比较、字符串比较、逻辑测试; 条件测试语法: test 条件表达式 或 [ 条件表达式 ] echo $? ##如果返回值为0,则条件成立 文件测试: [ 操作符 文件或目录 ] 操作符:-f ##是否是文件 -d ##测试是否是目录 -e ##测试是否存在 -r ##测试是否有读取权限 -w ##测试是否有写入权限 -x ##测试是否有执行权限 整数比较: 语法:[ 数1 操作符 数2 ] ##数字可引用变量,必须是整数 echo $? ##查看返回值,若为0则成立 操作符:-gt 大于 -ge 大于等于 -eq等于 -lt小于 -le 小于等于 -ne不等于 字符串比较:通常用于比较变量的值 语法:[ str1 == str2 ] ##判断字符串1等于字符串2 [ str1 != str2 ] ##判断字符串1不等于字符串2 [ -z str1 ] ##判断字符串1为空,例:[ -z $A ],若变量A存在则返回值为1,若不存在则为0 逻辑测试: 语法:[ 表达式1 ] && [ 表达式2 ] ##若表达式1与表达式2都成功时,才会成功,“和““与”; [ 表达式1 ] || [ 表达式2 ] ##表达式1或2有一个成功时,就会成功,“或”; ! [ 表达式1 ] ##若表达式1不成立时,则为成功,“非”; 二、if条件语句:单分支、双分支、多分支 单分支: 语法:if [ 条件表达式 ];then 命令操作 fi 注:单分支只有在条件成立时,才会执行命令操作; 双分支: 语法:if [ 条件表达式 ];then 命令操作1 else 命令操作2 fi 注:if的双分支时,条件表达式成立时,则执行命令操作1,若条件表达式不成立时,则执行命令操作2; 多分支: 语法:if [ 条件表达式1 ];then 命令操作1 elif [ 条件表达式2 ];then 命令操作2 elif 省略... else 默认命令操作 fi 注:if多分支时,依次判断条件表达式1,2,...,如果满足其中某个条件则执行对应命令操作,若所有条件表达式都不满足,则执行最后的默认命令操作; 三、扩展: 1.basename 文件位置 ##将一个文件的路径去除掉,只显示文件的名称; 2.arping -I eth0 -f 目标ip地址 ##ping对方主机并显示其MAC地址; 3.seq 1 10 ##输出1到10之间的所有整数到屏幕,默认是强制换行的; 4.expr $RANDOM % 100 ##生成100内的随机数,expr可以用来运算变量或者整数、例如: expr $A + $B ## 加+ 减- 乘\* 除/ 取余% shell脚本的测试与判断 1.测试 语法: [ 操作符 条件 ] == test 操作符 条件 测试的操作符:-f 文件,-d 目录, -e 是否存在,-r 是否可读,-w 是否可写 , -x 是否可执行 案例: [ -d /tmp ] echo $? 2)整数的比较 操作符: -eq 等于,-ne 不等于, -gt 大于, -lt 小于,ge 大于等于,le 小于等于 案例: [ 10 -gt 11 ] echo $? 3)字符串比较 字符串:指一种数据类型,可以理解位纯文本类型。 操作符:== 是否相等, != 不相等 , -z 是否为空 案例: STR1=hehe [ $STR1 == hehe ] echo $? [ $STR1 != linuxfan.cn ] echo $? STR2= ##直 接回车 echo $? [ -z $STR2 ] echo $? 4)逻辑判断 逻辑判断即与或非。 语法: [ 表达式1 ] &&(与),||(或) ,!(非) [ 表达式2 ] 命令1 &&,||,! 命令2 案例: 编译安装: ./configure &&make &&make [ 1 –ge 2 ] || [ 1 –lt 2 ] ##测试结果为真 echo $? 案例一:判断lftp是否安装若未安装则安装 #!/bin/bash rpm -qa |grep lftp 1>/dev/null if [ $? -ne 0 ];then yum -y install lftp &>/dev/null &&echo “lftp installed.” fi 案例二:判断主机CPU占用率 #!/bin/bash CHK_CPU=$(top -b -n 5 | grep Cpu |awk '{print $2}' |awk -F '%' '{print $1}'|tail -1) NUM=$(echo "$CHK_CPU*10" |bc |awk -F '.' '{print $1}') if [ $NUM -ge 10 ] then echo "CPU is high" fi 案例三:判断lftp是否安装若未安装则安装,安装则卸载; #!/bin/bash rpm -qa |grep lftp 1>/dev/null if [ $? -ne 0 ];then yum -y install lftp &>/dev/null &&echo “lftp installed.” else rpm -e lftp --nodeps &>/dev/null &&echo "lftp is remove" fi 案例四:测评分数脚本 #!/bin/bash while true;do read -p "请输入你的分数(退出输入exit):" NUM if [[ $NUM == exit ]];then echo "谢谢使用!!!" exit else expr $NUM + 1 &>/dev/null if [ $? -ne 0 ];then echo "输入的分数只能为0-100的整数!" elif [ -z $NUM ];then echo "输入的分数不能为空;" elif [ $NUM -eq 0 ];then echo "完美的避过了所有的正确答案!" else if [ $NUM -le 100 ]&&[ $NUM -ge 85 ];then echo "优秀!" elif [ 85 -ge $NUM ]&&[ 60 -le $NUM ];then echo "良好!" else echo "不及格!" fi fi fi done 案例五:测评分数脚本优化后 #!/bin/bash while true do read -p "请输入分数(退出输入exit)": COST if [ "$COST" == "exit" ];then echo -e "\n谢谢使用本次查询,再见!" exit 0 elif [ "$COST" == "0" ];then echo -e "\n您没有参加测试;" else expr $COST + 0 &>/dev/null if [ $? != 0 ];then echo -e "\n(输入的分数应为纯数字形式,请重新输入!)" else if [ 100 -ge $COST ] && [ $COST -ge 85 ];then echo -e "\n优秀\n" elif [ 84 -ge $COST ] && [ $COST -ge 60 ];then echo -e "\n良好\n" elif [ 60 -gt $COST ] && [ $COST -ge 0 ];then echo -e "\n差\n" else echo -e "\n(输入的分数超出正常范围,请重新输入!)" fi fi fi done 案例六:数值比较脚本 [root@ns bin]# cat if_then_fi.sh #!/bin/bash name=$(basename $0) ##$0代表脚本本身,basname的作用将脚本文件的完整路径省略掉,直接显示脚本文件的名 if [ $# -ne 2 -a $# -ne 3 ];then ##若脚本后边跟的数值不是两个也不是三个的时候 echo "Usage:" echo "$name vaule1 value2" echo "$name value1 value2 vaule3" exit 1 elif [ $# -eq 2 ];then ##若脚本后边跟的数值是两个的时候,返回两个值得内容,若不是两个,那么就是三个,返回三个值的内容 echo "two args:$1,$2" if [ $1 -gt $2 ];then echo "$1 > $2" elif [ $1 -lt $2 ];then echo "$1 < $2" else echo "$1 = $2" fi elif [ $# -eq 3 ];then echo "three args:$1,$2,$3" if [ $1 -gt $2 -a $1 -gt $3 ];then echo "$1 >$2,$1 >$3" elif [ $1 -gt $2 -a $1 -lt $3 ];then echo "$1 >$2,$1 < $3" elif [ $1 -gt $2 -a $1 -eq $3 ];then echo "$1 > $2,$1 = $3" elif [ $1 -lt $2 -a $1 -gt $3 ];then echo "$1 < $2,$1 > $3" elif [ $1 -lt $2 -a $1 -lt $3 ];then echo "$1 < $2,$1 < $3" elif [ $1 -lt $2 -a $1 -eq $3 ];then echo "$1 < $2,$1 = $3" fi fi exit 0 ##退出,返回值为0,正常退出 [root@ns bin]#./if_then_fi.sh 1 2 ##进行测试,1和2 是测试的值 案例七:数值比较脚本优化后 [root@ns bin]# cat if_then_fi.sh #!/bin/bash name=$(basename $0) ##$0代表脚本本身,basname的作用将脚本文件的完整路径省略掉,直接显示脚本文件的名 if [ -z $1 ]||[ -z $2 ];then echo "value1 or value2 not setting Empty" exit 1 elif [ $# -ne 2 -a $# -ne 3 ];then ##若脚本后边跟的数值不是两个也不是三个的时候 echo "Usage:" echo "$name vaule1 value2" echo "$name value1 value2 vaule3" exit 1 else expr $1 + 1 &>/dev/null A=$(echo $?) expr $2 + 1 &>/dev/null B=$(echo $?) if [ $A -ne 0 ] || [ $B -ne 0 ];then echo "value1 or value2 need setting integral( 0 - ~ )" elif [ $# -eq 2 ];then ##若脚本后边跟的数值是两个的时候,返回两个值得内容,若不是两个,那么就是三个,返回三个值的内容 echo "two args:$1,$2" if [ $1 -gt $2 ];then echo "$1 > $2" elif [ $1 -lt $2 ];then echo "$1 < $2" else echo "$1 = $2" fi elif [ $# -eq 3 ];then echo "three args:$1,$2,$3" if [ $1 -gt $2 -a $1 -gt $3 ];then echo "$1 >$2,$1 >$3" elif [ $1 -gt $2 -a $1 -lt $3 ];then echo "$1 >$2,$1 < $3" elif [ $1 -gt $2 -a $1 -eq $3 ];then echo "$1 > $2,$1 = $3" elif [ $1 -lt $2 -a $1 -gt $3 ];then echo "$1 < $2,$1 > $3" elif [ $1 -lt $2 -a $1 -lt $3 ];then echo "$1 < $2,$1 < $3" elif [ $1 -lt $2 -a $1 -eq $3 ];then echo "$1 < $2,$1 = $3" fi fi fi exit 0 ##退出,返回值为0,正常退出 [root@ns bin]# ./if_then_fi.sh 1 d value1 or value2 need setting integral( 0 - ~ ) [root@ns bin]# ./if_then_fi.sh 1 30 two args:1,30 1 < 30 [root@ns bin]# ./if_then_fi.sh value1 or value2 not setting Empty 案例八:编译安装的httpd服务控制脚本 #!/bin/bash if [ $1 == start ];then netstat -utpln |grep 80 &>/dev/null if [ $? -eq 0 ];then echo "httpd is started!" exit 1 else /usr/local/httpd/bin/apachectl start &>/dev/null echo "+/usr/local/httpd/bin/apachectl start" echo "+netstat -utpln |grep 80" netstat -utpln |grep 80 PID=$(netstat -utpln |grep 80 |awk '{print $7}'|awk -F'/' '{print $1}') echo -e "httpd is running ! PID is $PID" fi elif [ $1 == stop ];then netstat -utpln |grep 80 &>/dev/null if [ $? -ne 0 ];then echo "httpd is stoped!" exit 1 else /usr/local/httpd/bin/apachectl stop &>/dev/null echo "+/usr/local/httpd/bin/apachectl stop" sleep 2 echo "+netstat -utpln |grep 80" netstat -utpln |grep 80 if [ $? -ne 0 ];then echo "httpd is stopping!" fi fi elif [ $1 == restart ];then netstat -utpln |grep 80 &>/dev/null if [ $? -ne 0 ];then echo "httpd not is started!" /usr/local/httpd/bin/apachectl start &>/dev/null echo "+/usr/local/httpd/bin/apachectl start" sleep 2 echo "+netstat -utpln |grep 80" netstat -utpln |grep 80 if [ $? -eq 0 ];then echo "httpd is started!" fi else /usr/local/httpd/bin/apachectl stop &>/dev/null echo "+/usr/local/httpd/bin/apachectl stop" sleep 2 /usr/local/httpd/bin/apachectl start &>/dev/null echo "+/usr/local/httpd/bin/apachectl start" sleep 2 echo "+netstat -utpln |grep 80" netstat -utpln |grep 80 if [ $? -eq 0 ];then echo "httpd is started!" fi fi elif [ $1 == status ];then netstat -utpln |grep 80 &>/dev/null if [ $? -eq 0 ];then echo "httpd is running!" PID=$(netstat -utpln |grep 80 |awk '{print $7}'|awk -F'/' '{print $1}') echo -e "httpd is running ! PID is $PID" else echo "httpd is not running!" fi else echo "Usage: /etc/init.d/httpd start|stop|restart|status " fi |
|