shell条件语句及判断
一、条件测试:文件测试、整数比较、字符串比较、逻辑测试;
条件测试语法:
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