条件测试(test)命令共有三类条件测试表达式:

第一类是进行数值的比较,第二类是进行字符串的比较,第三类是进行文件的测试,例如测试一个文件是否存在等等。


 1.数值测试,需要两个操作数进行比较,即为双目测试符;

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

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

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

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

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

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

总结:eq相等,ne不相等,gt大于,lt小于,le小于等于,ge 大于等于

例如:

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

[root@localhost ~]# echo $?

1

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

[root@localhost ~]# echo $?

0

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

[root@localhost ~]# echo $?

0

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

[root@localhost ~]# echo $?

1

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

[root@localhost ~]# echo $?

0

[root@localhost ~]# test 1 -ge 2 

[root@localhost ~]# echo $?

1

也可以用 [   ]

例如:

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

[root@localhost ~]# echo $?

1

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


  注意:这类命令一般没有执行结果,只有执行状态返回值,所以当我们要查看比对结果的时候需要使用echo命令将执行的结果显示出来。



2.字符串测试:

 双目操作符:

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

    例如:

  ~]$ [[ abc == abc ]]
  ~]$  echo   $?

0


  ~]$ [[ abc == aba ]]
  ~]$  echo   $?
1

 !=:被测试的两个字符是否不相同,不同为真,相同为假; 这个符号的功能与==相反;

   例如:

~]$ [[ abc != abc ]]
  ~]$  echo   $?
1

~]$ [[ abc != aba ]]
~]$  echo   $?

   0

 

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

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

例如:

  ~]$ [[ abc < abd ]]
  ~]$  echo   $?
0

    

  ~]$ [[ abc < abb ]]
  ~]$  echo   $?
1

 =~:被测试的两个字符串,左边字符串能否被右边的字符串匹配,能匹配为真,不能匹配为假;

例如:

  ~]$ [[ abc =~ aba ]]

 ~]$ echo $?

1

  ~]$ [[ abcdef =~ abc ]]
  ~]$  echo   $?
0


 注意:>, <, =~这三类测试操作符只能用在[[ expression ]]测试语句中,在单个[  ]是使用不了的;

 单目操作符:

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

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


注意:

1) 通常情况下,字符串是要用引号引用的,单引号或双引号都可以,只有在特定的情况下,只能选择单引号或双引号之一;

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

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

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



3.文件测试:


 1)文件存在性测试

  -a file:测试的文件存在为真,不存在为假;

  -e file:测试的文件存在为真,不存在为假;


  2)文件类型测试

  -b file:被测试的文件是否存在并且是否为块设备;

  -c file:被测试文件是否存在并且为字符设备;

  -d file:被测试文件是否存在并且为目录设备;

  -f file:被测试文件是否存在并且为普通文件;

  -h|-L file:被测试的文件是否存在并且是否为符号链接文件;

  -s FILE:测试文件是否存在且其大小大于0;

  -S file:被测试文件是否存在并且是否为套接字文件;

    -t  file:测试文件描述符是否在终端上被打开;


 3)文件的访问权限设置:

  -r file:被测试文件是否存在,并且当前有效用户是否可读;

  -w file:被测试文件是否存在,并且当前有效用户是否可写;

  -x file:被测试文件是否存在,并且当前有效用户是否可执行;


 4)文件特殊权限标识测试:

 -u file:被测试的文件是否存在并且设置了SUID权限;

 -g file:被测试文件是否存在并且设置了SGID权限;

 -k file:被测试的文件是否存在并且是否设置了sticky权限;


  5)文件所有权测试:

  -O file:被测试的文件是否存在并且其属主是否为当前有效用户;

  -G file:被测试的文件是否存在并且其属组是否为当前有效用户的所在组;


 6)时间戳测试:

  -N file:被测试文件自从上一次被修改之后,是否被修改过;


  7)双目测试:

  file1 -ef file2 :测试的两个文件是否指向同一个文件系统的相同inode的

  

 8)硬链接测试:

  file1 -nt file2:被测试的两个文件,file1是否比file2更新;

  file1 -ot file2:被测试的两个文件,file1是否比file2更旧;




测试语句中可以添加逻辑运算:

 第一种表达式:

[ expression1 ] && [ expression2 ]

[ expression1 ] || [ expression2 ]

! [ expression ]


 第二种表达式:

[ expression1 -a expression2 ]

[ expression1 -o expression2 ]

[ ! expression ]

   

     在命令执行后会有一个结果的返回值,这个返回值分两种,第一种是正常的命令的输出结果,第二种是这个命令执行的状态,有的时候可能会没有第一种返回值,但一定会有第二种状态返回值。状态返回值的数字保存在“?”这个变量中,可以通过“echo $?”命令进行查看。根据不同的状态返回值的数字,我们可以判断命令执行的状态,命令的执行结果如下:

    0:成功

    1,2,127:为系统保留的状态返回值,在我们自己编写脚本的时候尽量避开这些

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

注意:

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