Shell脚本中的if判断

小虾米 阅读:174 2022-06-06 14:03:43 评论:0

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的数值! 

标签:linux
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

搜索
排行榜
关注我们

一个IT知识分享的公众号