条件测试命令:

  test命令 == [ 命令,bash的内建命令;

  格式:

   test expression

   [ expression ] 必须有空格,因为'[', ']'是两个参数,参数之间要用空格隔开;

   

   [[:bash的关键字,一般仅用于某些其他特定结构或这类格式中;

   ` expression `


   注意:此类条件测试命令一般没有执行结果,仅有执行状态返回值;如果其执行状态返回值为0,则表示true;如果执行状态返回值为1,则表示false;


[root@localhost ~]# [ 1 = 2 ]

[root@localhost ~]# echo $?     ---返回值为1,为假

1


   条件测试命令共有三类:

   1.数值测试:双目操作(要进行两个参数的比较);

        测试操作符:

          -eq:测试两个数值是否相等;相等为真,不等为假;

          

[root@localhost ~]# [ 1 -eq 2 ]

[root@localhost ~]# echo $?        ---不等为假,返回值为1

1

          -ne:测试两个数值是否不等;不等为真,相等为假;

[root@localhost ~]# [ 1 -ne 2 ]

[root@localhost ~]# echo $?        ---不等为真,返回值为0

0

          -lt:less then,少于,测试左边的数值是否小于右边的数值;小于为真,不小于为假;

[root@localhost ~]# [ 1 -lt 2 ]

[root@localhost ~]# echo $?        ---不小于为真,返回值为0

0

          -gt:大于,测试左边数值是否大于右边数值;大于为真,不大于为假;

[root@localhost ~]# [ 1 -gt 2 ]

[root@localhost ~]# echo $?        ---不大于为假,返回值为1

1

          -le:小于等于,测试左边的数值是否不大于右边的数值;如果不大于为真,大于为假;

[root@localhost ~]# [ 1 -le 1 ]

[root@localhost ~]# echo $?        ---不大于为真,返回值为0

0

          -ge:大于等于,测试左边的数值是否不小于右边的数值;不小于为真,小于为假;

[root@localhost ~]# [ 1 -ge 0 ]

[root@localhost ~]# echo $?        ---不小于为真,返回值为0

0

          注意:bash仅支持整数,不支持浮点数(诸如3.1415926)           

             [root@localhost ~]# [ 1.787878 -ge 0 ]

             -bash: [: 1.787878: 期待整数表达式

例子:

查看用户cl的uid是否大于等于1000,大于则输出Commmon User,小于等于则输出System User;其中

test == [  ]  参数之间要有空格

[root@localhost ~]#  test $(id -u cl) -ge 1000 && echo "Commmon User"  || echo "System User"

Commmon User

[root@localhost ~]#  [ $(id -u cl) -ge 1000 ] && echo "Commmon User"  || echo "System User"

Commmon User

判断文件num1.txt是否大于1000个字节,大于则是It's a bigfile.,否则输出It's a smallfile.。

[root@localhost ~]# [ $(stat -c %s num1.txt)  -ge 1000 ] && echo "It's a bigfile." || echo "It's a smallfile."

It's a smallfile.


   2. 字符串测试:

      双目测试:

        ==(通常写两个等号)或者=:测试两个字符串是否为相同的字符串;相同为真,不同为假;

[root@localhost ~]# [ a == a ]

[root@localhost ~]# echo $?      ---相同为真,返回值为0

0

        !=:测试两个字符串是否为不同的字符串;不同为真,相同为假;

[root@localhost ~]# [ a != a ]

[root@localhost ~]# echo $?      ---相同为假,返回值为1

1

        >:测试左边的字符串所对应的ASCII编码是否比右边对应的ASCII编码大;大于为真,小于为假;

[root@localhost ~]# [[ a > b ]]

[root@localhost ~]# echo $?      ---在对应的ASCII编码中,a的位置在b的前边,所以返回值为 1                         1,假


        <:测试左边的字符串所对应的ASCII编码是否比右边对应的ASCII编码小;小于为真,大于为假;

[root@localhost ~]# [[ a < b ]]

[root@localhost ~]# echo $?      ---在对应的ASCII编码中,a的位置在b的前边,所以返回值为0

0

        STRING =~ PATTERN:测试左侧的字符串能否被右边的模式pattern匹配;能匹配为真,不能匹配为假;

[root@localhost ~]# NEWVAR=        ---定义NEWVAR=  (空)

[root@localhost ~]# [[ NEWVAR =~ [^[:digit:]] ]]  ---判断NEWVAR是否是非十进制数字

[root@localhost ~]# echo $?         ---结果匹配为真,返回值为0

0


        注意:>,<,=~这三类测试操作符只能用在` expression `测试语句中。


      单目测试:

      -z 'STRING':测试string字符串是否为空字符串;空串为真,不空为假;

[root@localhost ~]# NEWVAR=122

[root@localhost ~]# [ -z NEWVAR ]

[root@localhost ~]# echo $?    ---定义的NEWVAR为122,所以返回值为1假

1

 


      -n 'STRING':测试string字符串是否为非空串;不空为真,空串为假;


      注意:1、通常情况下,字符串是要用引号引用的,单引号或双引号都可以;只有在特定的场合或情况下,只能选择单引号或双引号其中一个;

            2、[]和[[]]在某些情况下,意义不完全相同,要区分对待;

            3、如果使用[]或[[]]进行条件判断,在表达式的两端都留有空白字符,以区分命令和参数之间的关系;

            4、所有的双目操作符和参数之间也要留有空白字符空间;


文件测试:

  单目测试(较常用):

   -a或者-e  FILE:测试文件是否存在;存在为真,不存在为假;

[root@localhost ~]# [ -a num1.txt ]

[root@localhost ~]# echo $?    ---文件存在,为真,返回值为0

0

   -b FILE:测试文件是否存在且为块设备文件;存在且为块设备为真,否则为假;

[root@localhost ~]# [ -b num1.txt ]

[root@localhost ~]# echo $?    ---文件存在,但是属于非块儿设备,假,返回值为1

1

   -c FILE:测试文件是否存在且为字符设备;存在且为字符设备为真,否则为假;

[root@localhost ~]# [ -c ID.sh ]

[root@localhost ~]# echo $?   ---ID.sh明显为脚本文件,所以存在但为假,返回值为1

1

   -d FILE:测试文件是否存在且为目录文件;存在且为目录文件为真,否则为假;

[root@localhost ~]# [ -d /tmp ]

[root@localhost ~]# echo $?   ---根下的文件tmp,文件存在且为目录文件为真,返回值为0

0

   -f FILE:测试文件是否存在且为普通文件;存在且为普通文件为真,否则为假;

[root@localhost ~]# [ -f num1.txt ]

[root@localhost ~]# echo $?   ---存在且为普通txt文件,返回值为0

0

   -h或-L FILE:测试文件是否存在且为符号链接文件;存在且为符号链接文件为真,否则为假;

[root@localhost ~]# [ -h num1.txt ]

[root@localhost ~]# echo $?   ---存在但非符号链接文件,假,返回值为1

1

   -s FILE:测试文件是否存在且其大小大于0;存在且其大小大于0为真,否则为假;

[root@localhost ~]# [ -s num1.txt ]

[root@localhost ~]# echo $?   ---存在且大小大于0,真,返回值为0

0

   -S FILE:测试文件是否存在且为套接字文件;存在且为套接字文件为真,否则为假;

[root@localhost ~]# [ -S num1.txt ]

[root@localhost ~]# echo $?   ---虽然存在但不为套接字文件,假,返回值1

1

   -t FD FILE:测试文件描述符是否在终端上被打开;存在且在终端上被打开为真,否则为假;


   文件的访问权限测试:

   -r FILE:测试文件是否存在且当前用户是否被授予读取权限;存在且授权为真,否则为假;

[root@localhost ~]# su - cl

上一次登录:二 9月 19 04:01:51 CST 2017:0 上

[cl@localhost ~]$ [ -r num1.txt ]

[cl@localhost ~]$ echo $?     ---更换用户cl,未授予该用户读权限,假,返回值1

1

   -w FILE:测试文件是否存在且当前用户是否被授予写权限;存在且授权为真,否则为假;

[cl@localhost ~]$ [ -w num1.txt ]

[cl@localhost ~]$ echo $?    ---更换用户cl,未授予该用户写权限,假,返回值1

1

   -x FILE:测试文件是否存在且当前用户是否被授予执行权限;存在且授权为真,否则为假;

[cl@localhost ~]$ [ -x num1.txt ]

[cl@localhost ~]$ echo $?    ---更换用户cl,未授予该用户执行权限,假,返回值1

1

   文件特殊权限标识测试:

    -u FILE:测试文件是否存在且设置了SUID;存在且授权为真,否则为假;

    -g FILE:测试文件是否存在且设置了SGID;存在且授权为真,否则为假;

    -K FILE:测试文件是否存在且设置了STICKY;存在且授权为真,否则为假;


   文件的所有权测试:

    -O FILE:测试文件是否存在且其属主是否为当前有效用户;存在且属主为当前有效用户为真,否则为假;

[root@localhost ~]# [ -O num1.txt ]

[root@localhost ~]# echo $?     ---root下,测试是否当前有效用户,真,返回值0

0

    -G FILE:测试文件是否存在且其属组是否为当前有效用户的所在组;存在且属主为当前有效用户的所在组为真,否则为假;

[root@localhost ~]# su - cl

上一次登录:三 11月 22 17:19:11 CST 2017pts/0 上

[cl@localhost ~]$ [ -G num1.txt ]

[cl@localhost ~]$ echo $?    ---切换用户cl,非当前有效用户的所在组,假,返回值1

1


  双目测试:

    FILE1 -ef FILE2 :测试两个文件是否拥有相同的Inode编号;即:两个文件是否为硬连接;是硬连接为真,否则为假;

[root@localhost ~]# [ newtest -ef test ]

[root@localhost ~]# echo $?        

1


 测试语句中添加逻辑运算符号:

  1.利用bash的逻辑运算符号:

   [ expression1 ] && [ expression2 ] 

   [ expression1 ] || [ expression2 ] 

   ![ expression ] 

示例:

判断用户cl是否存在,并输出相应内容。

[root@localhost ~]# ! [ id cl &> /dev/null ] && echo "user is alive." || echo "no user." 

user is alive.


  2.利用条件测试命令本身的逻辑运算符号:

   [ expression1 -a expression2 ]   \\与&&类似

   [ expression1 -o expression2 ]  \\与||类似

   [ ! expression ]           \\与![ expression ]类似,!位置不一样,含义不一样,但                           \\是作用相同


  命令的执行结果:

   1.命令的正常输出结果;

   2.命令的执行状态返回值;

     0-255

     0:表示命令执行成功或条件判断为真;

     1-255:表示命令执行失败或条件判断为假;

       1,2,127:系统默认保留的;

       3-126,128-255:用户自定义的命令执行状态返回值;


   exit命令:

     exit the shell

     格式:exit [n]

        退出shell时可以使用n作为状态返回值;如果没有指定n,则默认的状态返回值为最后一条命令的状态返回值;


      注意:当shell脚本运行时,一旦遇到exit命令将立即结束当前运行此脚本的shell进程,同时此脚本的运行也会停止,其后续的所有命令都不会再被解释执行;因此,包含了exit命令的脚本,不要使用source命令来执行。