shell的条件判断主要分为三大部分的内容:

  • 条件测试类型

  • 条件测试表达式

  • 语句之间的逻辑关系

条件测试表达式

    1、表达式的写法:

        [ expression ]

        ` expression `

        test expression

    2、条件测试表达式的注意事项:

        [ expression ] expression 和中括号之间是有空格,如果没有空格将会报错。

        [ expression ] ` expression ` 作用相同,但是含义不同。

        test expression 其中test是shell提供的一个命令。其返回结构是expression的逻辑结果

    3、何时需要使用 [ expression ]

        当bash shell的脚本中出现 类似-gt,-lt这样的整数测试符或者 -e $FILE 这样的文件测试符的时间才可以使用[],

        if [ grep 'root' /etc/passwd ] 这样是错误的。

        if 可以直接使用 grep 'root' /etc/passed的命令结果的。

        [root@bogon sh]# cat if.sh
        #!/bin/bash
        if grep 'root' /etc/passwd &> /dev/null ;then
            echo "there is root "
          else
          echo "there is no root"
        fi
        [root@bogon sh]# ./if.sh
        there is root

        从命令的执行结果可以知道:if 可以取得grep命令的执行结果。相当与执行来grep命令后的$?的值。此处,我们也需要仔细理解何时需要使用 &>/dev/null 如果我们需要命令执行的返回值,那么不许要使用 &>/dev/null ,如果我们需要命令执行结果,也就是说相当与命令执行完成后的$?值,那么,就需要使用&>/dev/null.


条件测试类型:对shell而言,常用的条件测试类型有三种:整数测试;字符串测试;文件测试


整数测试:


测试符用法举例含义
-gt[ $A -gt $B ]gt:great then 如果$A大于$B 结果为真,否则结果为假。
-lt[ $A -lt $B ]lt:less then 如果$A小于$B结果为真,否则为假
-eq[ $A -eq $B ]eq:equal 如果$A 等于$B 结果为真,否则结果为假
-ge[ $A -ge $B ]如果$A大于等于$B结果为真,否则结果为假
-le [ $A -le $B ]如果$A小于$B结果为真,否则结果为假
-ne[ $A -ne $B ]如果$A不等于$B 结果为真,否则结果为假

其中整数测试需要注意的事项有:

  • 整数测试的运算符都是双目运算符

  • 测试符的两侧数据只能是整数。浮点数是不可以的。

  • 测试数与中括号是有空格符的。


字符串测试:可以分别用操作符 =、 !=、< 和 > 比较字符串是否相等、不相等或者第一个字符串的排序在第二个字符串的前面或后面。单目操作符 -z 测试 null 字符串,如果字符串非空 -n 返回 True(或者根本没有操作符)。


= :[  'abc' = 'dcf' ] # 判断=两侧的字符串是否一样 #注意区分下面的例子。

[root@localhost sh]# [ 'abc' = 'dcf' ];echo $?

1

[root@localhost sh]# [ 'abc'='dcf' ];echo $? 

0


!=  [ 'abc' != 'dcf' ] #判断两个字符串是否不等,不等为真,否则未见

[root@localhost sh]# [ 'abc' != 'dcf' ];echo $?

0


<   [ 'abc' \< 'bcd' ]  # 判断后面的字符串是否在前面的字符串的前面

[root@bogon testdir]# [ 'abc' \< 'bcd' ] ; echo $?
0


> 同理,判断前面的字符串排序是否在后面字符串的前面


字符串测试单目操作符: -z ,-n

[root@bogon testdir]# [ -n 'abc' ];echo $?
0
[root@bogon testdir]# [ -n '' ];echo $?
1

[ -n $STRING ] 如果$STRING 是空,则返回为真,否则返回为假。


[root@bogon testdir]# [ -z 'abc' ]; echo $?
1
[root@bogon testdir]# [ -z ' ' ];echo $?
1
[root@bogon testdir]# [ -z  ];echo $?
0
[root@bogon testdir]# [ -z $STRING ] ;echo $?
0

[ -z $STRING ] 如果$STRING 为NULL,或者根本没有定义,返回为真,否则返回为假。


小结:

    字符串测试符号,中有单目运算符 [ -n $STRING  ]  [ -z $STRING ] 也有双目运算符,= ;!=;

<; > 需要注意的-z -n的区别,和<,>需要使用转义字符\


文件测试

测试符
用法举例
含义
-f
[  -f $FILE ]
如果$FILE是普通文件,返回真,否则返回假
-d
[ -d $FILE  ]
如果$FILE是目录,返回真,否则返回假
-r
[ -r $FILE ]
如果$FILE 是可读的,返回真,否则返回假
-w
[ -w $FILE ]
如果$FILE 是可写的,返回真,否则返回假
-x
[ -x $FILE ]
如果$FILE 是可执行的,返回真,否则返回假
-s
[ -s $FILE ]
如果$FILE是非空的,返回真,否则返回假
-e
[ -e $FILE ]
如果$FILE 是存在的,返回真,否则返回假

注意:

$FILE,需要路径,也就是脚本能找到的路径。


语句间的逻辑关系:

&&:逻辑与

||    ; 逻辑或


command1 && command2;

如果com1 返回值是假,那么com2不会执行

如果com1 返回只是真,那么com2一定要执行,二者执行的结果决定com1 && com2的返回结果


com1 || com2

如果com1 执行结果为真,那么com2不会执行,

如果com1执行结果为假,那么com2一定要执行,二者执行的结果决定com1 || com2的返回的结果


以上就是短路逻辑的实例。



条件测试是shell脚本的基础,涉及的内容包括,测试表达式的写法,条件测试的分类,各种测试符的使用。也包括语句之间的逻辑关系。需要特别理解短路逻辑的含义。