Shell脚本中的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 [ “ a " − e q " a" -eq " a"eq"b” ]
  • -ne 不等于,如:if [ “ a " − n e " a" -ne " a"ne"b” ]
  • -gt 大于,如:if [ “ a " − g t " a" -gt " a"gt"b” ]
  • -ge 大于等于,如:if [ “ a " − g e " a" -ge " a"ge"b” ]
  • -lt 小于,如:if [ “ a " − l t " a" -lt " a"lt"b” ]
  • -le 小于等于,如:if [ “ a " − l e " a" -le " a"le"b” ]
  • < 小于(需要双括号),如:((“ a " < " a" < " a"<"b”))
  • <= 小于等于(需要双括号),如:((“ a " < = " a" <= " a"<="b”))
  • > 大于(需要双括号),如:((“ a " > " a" > " a">"b”))
  • >= 大于等于(需要双括号),如:((“ a " > = " a" >= " a">="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的数值!
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐