Shell脚本中的if判断
文章目录
- Shell脚本中的if判断
- if的基本语法
- 最简单用法
- 多分支判断
- if判断中的参数
- 文件/文件夹(目录)判断
- 字符串判断
- 数值判断
- 复杂逻辑判断
在写shell脚本的时候,条件判断是最常用到的,尤其刚写shell脚本的时候,一些高级命令语法不会使用,到处都是if。
但if的参数及用法其实也并不少,想要用的好,也要下一些功夫。下面我们一起来看下:
if的基本语法
最简单用法
if [ condition ];then
符合condition条件执行的语句
fi
condition
是判断条件,如果condition
成立,那么 then 后边的语句将会被执行;如果 condition
不成立,那么不会执行任何语句。
从本质上讲,if 检测的是命令的退出状态.
注意:最后必须以fi
来闭合,fi 就是 if 倒过来拼写。
示例:
#!/bin/sh
echo -e "Please input the first num [a]:\c"
read a
echo -e "Please input the second num [b]:\c"
read b
if [ $a -eq $b ];then
echo "a等于b."
fi
输入结果:
Please input the first num [a]:10
Please input the second num [b]:10
a等于b.
多分支判断
if [ condition1 ];then
符合condition1条件执行的语句
elif [ condition2 ];then
符合condition2条件执行的语句
else
不符合condition1和condition2条件执行的语句
fi
示例:
#!/bin/sh
echo -e "Please input one num: \c"
read num
if [ $num -eq 1314 ]; then
echo "恭喜您,中了 特等奖!"
elif [ $num -ge 0 && $num -le 9 ]; then
echo "恭喜您,中了 一等奖!"
elif [ $num -ge 10 && $num -le 19 ]; then
echo "恭喜您,中了 二等奖!"
elif [ $num -ge 20 && $num -le 29 ]; then
echo "恭喜您,中了 三等奖!"
else
echo "很遗憾,未中奖!"
fi
输出结果:
Please input one num: 1314
恭喜您,中了 特等奖!
Please input one num: 12
恭喜您,中了 二等奖!
Please input one num: 44
很遗憾,未中奖!
Please input one num: 1
恭喜您,中了 一等奖!
Please input one num: 25
恭喜您,中了 三等奖!
if判断中的参数
文件/文件夹(目录)判断
下面粗体几个是最常用的
- [ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真。
- [ -c FILE ] 如果 FILE 存在且是一个字特殊文件则为真。
- [ -d DIR ] 如果 DIR 存在且是一个目录则为真。
- [ -e FILE ] 如果 FILE 存在则为真。
- [ -f FILE ] 如果 FILE 存在且是一个普通文件则为真。
- [ -g FILE ] 如果 FILE 存在且已经设置了SGID则为真。
- [ -k FILE ] 如果 FILE 存在且已经设置了粘制位则为真。
- [ -p FILE ] 如果 FILE 存在且是一个名字管道(F如果O)则为真。
- [ -r FILE ] 如果 FILE 存在且是可读的则为真。
- [ -s FILE ] 如果 FILE 存在且大小不为0则为真。
- [ -t FD ] 如果文件描述符 FD 打开且指向一个终端则为真。
- [ -u FILE ] 如果 FILE 存在且设置了SUID (set user ID)则为真。
- [ -w FILE ] 如果 FILE存在且是可写的则为真。
- [ -x FILE ] 如果 FILE 存在且是可执行的则为真。
- [ -O FILE ] 如果 FILE 存在且属有效用户ID则为真。
- [ -G FILE ] 如果 FILE 存在且属有效用户组则为真。
- [ -L FILE ] 如果 FILE 存在且是一个符号连接则为真。
- [ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read则为真。
- [ -S FILE ] 如果 FILE 存在且是一个套接字则为真。
- [ FILE1 -nt FILE2 ] 如果 FILE1修改日期比FILE2更近(FILE1比FILE2新)或者 如果FILE1存在且FILE2 不存在则为真。
- [ FILE1 -ot FILE2 ] 如果 FILE1 比 FILE2 老, 或者 FILE2 存在且 FILE1 不存在则为真。
- [ FILE1 -ef FILE2 ] 如果 FILE1 和 FILE2 指向相同的设备和节点号则为真。
字符串判断
- [ -z STRING ] 如果STRING的长度为零则为真 ,即判断是否为空,空即是真;
- [ -n STRING ] 如果STRING的长度非零则为真 ,即判断是否为非空,非空即是真;
- [ STRING1 = STRING2 ] ([ STRING1 == STRING2 ],与=等价)如果两个字符串相同则为真 ;
- [ STRING1 != STRING2 ] 如果字符串不相同则为真 ;
- [ STRING1 ] 如果字符串不为空则为真,与-n类似
数值判断
- -eq 等于,如:if [ “b” ]
- -ne 不等于,如:if [ “b” ]
- -gt 大于,如:if [ “b” ]
- -ge 大于等于,如:if [ “b” ]
- -lt 小于,如:if [ “b” ]
- -le 小于等于,如:if [ “b” ]
- < 小于(需要双括号),如:((“b”))
- <= 小于等于(需要双括号),如:((“b”))
- > 大于(需要双括号),如:((“b”))
- >= 大于等于(需要双括号),如:((“b”))
复杂逻辑判断
- -a 与 &&
- -o 或 ||
- ! 非
示例:
#!/bin/sh
echo -e "please input your score: \c"
read score
if [ "$score" -ge "0" ]&&[ "$score" -lt "60" ];then
echo "很抱歉,未及格!"
elif [ "$score" -ge "60" ]&&[ "$score" -lt "85" ];then
echo "恭喜你,及格了!"
elif [ "$score" -le "100" ]&&[ "$score" -ge "85" ];then
echo "恭喜你,优秀!"
else
echo "请输入0-100的数值!"
fi
输出结果:
please input your score: 99
恭喜你,优秀!
please input your score: 60
恭喜你,及格了!
please input your score: 35
很抱歉,未及格!
please input your score: 101
请输入0-100的数值!