通过博文Shell脚本基础,可以在简单的Shell脚本程序中,各类语句将按先后顺序依次执行,从而实现批处理的自动化过程,然而,单一的顺序结构使得脚本国语机械化,不够“智能”,难以处理更加灵活的系统任务。

今天我们将认识并掌握如何进行条件测试操作,并通过正确使用if语句,使Shell脚本具有一定的“判断”能力,以根据不同的条件来完成不同的管理任务。

条件测试操作

要使Shell脚本具有一定的“智能”,面临的第一个问题就是如何区分不同的情况已确定执行何种操作。例如:当磁盘使用率达到某个点时,发出警告信息等操作。

Shell环境根据命令执行后的返回状态值($?)来判断是否执行成功,当返回值为0时,表示成功;当返回值为非0时,则表示失败。使用专门的测试工具——test命令,可以对特定条件进行测试。

在shell编程中,条件测试常用的语法形式,如图:

语法1与语法2效果是一样,但是建议使用语法2;语法3“[[]]”(双中括号)可以使用通配符进行模式匹配,两者的区别在于:

  • &&、||、>、<等操作符可以应用于语法3中,但不能应用于语法1和语法2中;
  • 在语法1中一般用-a、-o、-gt(用于整数)、-lt(用于整数)代替上述操作符;

注意:语法2格式中括号“[ 条件表达式 ]”与条件表达式至少需要一个空格进行分隔!

根据需要测试的条件类型不同,条件表达式也不同,比较常用的条件操作包括:

1.文件测试

文件测试指的是根据特定的路径,判断对应的文件是目录还是文件,或者是否可读、可写、可执行等操作。常用的选项有:

-d:测试是否为目录(Directory); -e:测试目录或文件是否存在(Exist); -f:测试是否为文件(File); -r:测试当前用户是否有权限读取(Read); -w:测试当前用户是否有权限写入(Write); -x:测试当前用户是否有权限执行(eXcute); -s:测试文件内容是否为空; -z:测试字符串长度是否为空;


示例:

[root@localhost ~]# test -f /etc/passwd && echo true || echo false true [root@localhost ~]# [ -f /etc/passwd ] && echo true || echo false true [root@localhost ~]# [ -f /etc/passwd1 ] && echo true || echo false false [root@localhost ~]# [[ -f /etc/passwd ]] && echo true || echo false true [root@localhost ~]# [[ -f /etc/passwd1 ]] && echo true || echo false false //进行判断,输出结果 [root@localhost ~]# echo $a

[root@localhost ~]# [ -f $a ] && echo true || echo false true [root@localhost ~]# [ -f "$a" ] && echo true || echo false false //如果测试条件中有变量,必须带双引号(“”),否则出现错误



### 2.整数值比较
整数值比较指的是根据给定的两个整数值,判断第一个数与第二个数的关系,比如等于、大于、小于等。常用的选项有:
>```
-eq:等于(Equal)
-ne:不等于(Not Equal)
-gt:大于(Greater Than)
-lt:小于(Lesser Than)
-le:小于或等于(Lesser or Equal)
-ge:大于或等于(Greater or Equal)

整数值比较在Shell甲苯编写中的应用较多。例如,用来判断已登录用户数量、开启的进程数等。比如:

[root@localhost ~]# A=who | wc -l [root@localhost ~]# [ $A -eq 3 ] && echo "nice" nice //查看当前登录用户为3的话输出“nice” [root@localhost ~]# [ 5 -lt 6 ] && echo 1 || echo 0 1 [root@localhost ~]# [[ 5 < 6 ]] && echo 1 || echo 0 1 [root@localhost ~]# [[ 5 -eq 6 ]] && echo 1 || echo 0 0//虽然结果是正确的,但是不建议使用“<”、“>”。建议使用“=”


进行整数比较时,建议使用第2种语法→第4种语法→第3种语法

### 3.字符串比较
字符串比较通常用力啊检查用户输入、系统环境等是否满足条件,在提供交互式操作的脚本中,也可以用来判断用户输入的位置参数是否符合要求。常用的参数有:
>```
=:字符串内容相同
!=:字符串内容不同,! 号表示相反的意思
-z:字符串内容为空

语法格式:

[ 字符串1 = 字符串2 ] [ 字符串1 != 字符串2 ] [ -z 字符串 ]


**注意:判断条件中如果有变量,则必须带双引号,等号两边必须有空格!**

### 4.逻辑测试
逻辑测试指的是判断两个或多个条件之间的依懒关系。当系统任务取决于多个不同的条件时,根据这些条件是否同时成立或其中一个成立等情况,需要有一个测试过程,常用的参数有:
>```
-a或&&:逻辑与,“而且”的意思;
-o或||:逻辑或,“或者”的意思;
!:逻辑否,“取反”的意思;

语法格式:

格式1:[ 表达式1 ] 操作符 [ 表达式2 ] ... 格式2:命令1 操作符 命令2 ...


**注意:“[]”中不能用&&或||,可以使用“-a”、“-o”;[[]]中可以使用,但是不可以使用“-a”或“-o”;(())中不可以使用“-a”或“-o”,可以使用&&或||**!

**总结:**
![](https://s1.51cto.com/images/blog/201910/13/59c39111f12ac95fdf76cefb30bce239.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_30,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=)

———————— 本文至此结束,感谢阅读 ————————