良许Linux教程网 干货合集 Shell脚本的条件测试和if条件语句使用

Shell脚本的条件测试和if条件语句使用

一、条件测试操作

test命令是专门用来测试的工具,能够对特定条件进行测试,然后根据返回值及进行判断条件是否成立。

使用test测试命令时,包括以下两种形式:

test 条件表达式
[ 条件表达式 ]

这两种方式的作用完全相同,但通常后一种形式更为常用,需要注意的是,方括号“[“ 或 ”]”与条件表达式之间需要至少一个空格进行分隔。

1、文件测试:

  • -d:测试是否为目录(Directory);
  • -e:测试文件或目录是否存在(Exist);
  • -f:测试是否为文件(File);
  • -r:测试当前用户是否有权限读取(Read);
  • -w:测试当前用户是否有权限写入(Write);
  • -x:测试是否设置有可执行(Excute)权限;

执行条件测试操作以后,通过预定义变量$?可以获得测试命令的返回状态值,从而判断该条件是否成立。例如,执行以下操作可以测试目录/media/是否存在,如果返回值$?为0,表示存在此目录,否则表示不存在或者虽然存在但不是目录。

[root@CentOS01 ~]# test -d /boot      
[root@centos01 ~]# echo $?           
0                      

若测试的条件不成立,则测试操作的返回值将不为0(通常为1).

[root@centos01 ~]# test -d /ertec        
[root@centos01 ~]# echo $?         
1         

2、整数值比较:

  • -eq:第一个数等于(Equal)第二个数;
  • -ne:第一个数不等于(Not Equal)第二个数;
  • -gt:第一个数大于(Greater Than)第二个数;
  • -lt:第一个数小于(Lesser Than)第二个数;
  • -le:第一个数小于或等于(Lesser or Equal)第二个数;
  • -ge:第一个数大于或等于(Greater or Equal)第二个数;

整数值比较在Shell脚本编写中的应用较多。例如,用来判断已登录用户数量、开启进程数、磁盘使用率是否超标,以及软件版本号是否符号要求等。实际 使用时,往往会通过变量引用、命令替换等方式来获取一个数值。

3、字符串比较:

  • =:第一个字符串与第二个字符串相同。
  • !=:第一个字符串与第二个字符串不相同,其中 “ !”表示取反。
  • -z:检查字符串是否为空,对于未定义或赋予空值的变量将是为空串。
[root@centos01 ~]# a=1
[root@centos01 ~]# b=2 
[root@centos01 ~]# [ $a = $b ] && echo "yes"  
            
[root@centos01 ~]# a=1 
[root@centos01 ~]# b=2 
[root@centos01 ~]# [ $a != $b ] && echo "yes"  
yes        

4、逻辑测试:

  • &&:逻辑与,表示“而且”,只有当前后两个条件都成立时,整个测试命令的返回值才为0(结果成立),使用test命令测试时,“&&”可以使用“-a”代替。
  • ||:逻辑或,表示“或者”,只要前后两个条件有一个成立,整个测试命令返回的值即为0(结果成立)。使用test命令测试时可以使用“-o”代替。
  • !:逻辑否,表示“不”,只有当条件不成立时,整个测试命令返回的值才为0(结果成立)。

示例如下:

[root@centos01 ~]# a=100
[root@centos01 ~]# [ $a = 100 ] && [ $a != 50 ] && echo "yes" 
yes      
[root@centos01 ~]# c=100 
[root@centos01 ~]# [ $a = 100 ] || [ $a -ge 50 ] && echo "yes"   
yes     

二、使用if条件语句

1、单分支if语句

if语句的“分支”指的是不同测试结果所对应的执行语句(一条或多条)。对于单分支的选择结构,只有在“条件成立”时才会执行相应的代码,否则不会执行任何操作。单分支if语句的语法格式如下所示:
Shell脚本的条件测试和if条件语句使用

单分支if语句示例:

[root@centos01 ~]# cd /usr/src/ppp     
-bash: cd: /usr/src/ppp: 没有那个文件或目录  
[root@centos01 ~]# vim if_dan.sh  
#!/bin/bash           
mount="/usr/src/ppp"       
if [ ! -d $mount ]            
then                  
        mkdir -p $mount             
fi             
[root@centos01 ~]# chmod +x if_dan.sh       
[root@centos01 ~]# ./if_dan.sh         
[root@centos01 ~]# cd /usr/src/ppp/ 
[root@centos01 ppp]# ls

2、双分支if语句

对于双分支的选择结构,要求针对“条件成立” “条件不成立”两种情况分别执行不同的操作。双分支if语句的语法格式如下所示:
Shell脚本的条件测试和if条件语句使用

双分支if语句示例:

[root@centos01 ~]# vim if_shuang.sh 
#!/bin/bash
ping -c 3 -i 0.2 -W 3 $1 &> /dev/null 
if [ $? -eq 0 ]         
then              
    echo "Host:$1 is UP!!!"
else                
    echo "Host:$1 is DOWN!!!"
fi     
[root@centos01 ~]# chmod +x if_shuang.sh        
[root@centos01 ~]# ./if_shuang.sh 192.168.100.10      
Host:192.168.100.10 is UP!!!     
[root@centos01 ~]# ./if_shuang.sh 192.168.100.103  
Host:192.168.100.103 is DOWN!!!           

3、多分支if语句

由于if语句可以根据测试结果的成立、不成立分别执行操作,所有能够嵌套使用,进行多次判断。例如,首先判断某学生的得分是否及格,若及格则再次判断是否高于90分等。多分支if语句的语法格式如下:
Shell脚本的条件测试和if条件语句使用

多分支if语句示例:

[root@centos01 ~]# vim if_duo.sh    
#!/bin/bash
read -p "请输入考试成绩:" insert 
if [ $insert -ge 85 ] && [ $insert -le 100 ]   
   then
        echo "恭喜您考试成绩为优秀!!!"
elif [ $insert -ge 70 ] && [ $insert -le 84 ]  
   then
        echo "恭喜您考试成绩为合格!!!"
else          
        echo "很遗憾您考试成绩可以收拾收拾回家种苞米了!!!"
fi           
[root@centos01 ~]# chmod +x if_duo.sh     
[root@centos01 ~]# ./if_duo.sh    
请输入考试成绩:94        
恭喜您考试成绩为优秀!!!
[root@centos01 ~]# ./if_duo.sh
请输入考试成绩:82
恭喜您考试成绩为合格!!!
[root@centos01 ~]# ./if_duo.sh 
请输入考试成绩:71
恭喜您考试成绩为合格!!!
[root@centos01 ~]# ./if_duo.sh 
请输入考试成绩:32
很遗憾您考试成绩可以收拾收拾回家种苞米了!!!

总结;test命令用法:

1)判断表达式
if test (表达式为真)
if test !表达式为假
test 表达式1 –a 表达式2 两个表达式都为真
test 表达式1 –o 表达式2 两个表达式有一个为真

2)判断字符串
test –n 字符串 字符串的长度非零
test –z 字符串 字符串的长度为零
test 字符串1=字符串2 字符串相等
test 字符串1!=字符串2 字符串不等

3)判断整数
test 整数1 –eq 整数2 整数相等
test 整数1 –ge 整数2 整数1大于等于整数2
test 整数1 –gt 整数2 整数1大于整数2
test 整数1 –le 整数2 整数1小于等于整数2
test 整数1 –lt 整数2 整数1小于整数2
test 整数1 –ne 整数2 整数1不等于整数2

4)判断文件
test File1 –ef File2 两个文件具有同样的设备号和i结点号
test File1 –nt File2 文件1比文件2 ,;;
test –b File 文件存在并且是块设备文件
test –c File 文件存在并且是字符设备文件
test –d File 文件存在并且是目录
test –e File 文件存在
test –f File 文件存在并且是正规文件
test –g File 文件存在并且是设置了组ID
test –G File 文件存在并且属于有效组ID
test –h File 文件存在并且是一个符号链接(同-L)
test –k File 文件存在并且设置了sticky位
test –b File 文件存在并且是块设备文件
test –L File 文件存在并且是一个符号链接(同-h)
test –o File 文件存在并且属于有效用户ID
test –p File 文件存在并且是一个命名管道
test –r File 文件存在并且可读
test –s File 文件存在并且是一个套接字
test –t FD 文件描述符是在一个终端打开的

以上就是良许教程网为各位朋友分享的Linux系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你!

良许微信公众号

本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部