首页 > 代码库 > shell脚本编程之条件测试——test

shell脚本编程之条件测试——test

  test测试命令有三类测试表达式,第一类是进行数值的比较,第二类是进行字符串的比较,第三类是进行文件的测试,比如测试一个文件是否存在等。


 1.数值测试,需要两个操作数进行比较

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

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

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

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

  -le:被测试的两个数值,左边的是否小于等于右边的;

总结一下就是:eq相等,ne不相等,gt大于,lt小于,ge大于等于,le 小于等于,not非,mod求模

  ~]$ test 3 -eq 4
  ~]$ echo $?
   1
  ~]$ test 3 -ne 4
  ~]$ echo $?
   0
  ~]$ test 3 -gt 4
  ~]$ echo $?
   1
  ~]$ test 3 -lt 4
  ~]$ echo $?
   0

在写脚本的时候我们会需要进行条件判断,所以我们需要用到test命令,这种命令在脚本里时只需要将测试的内容写在中括号里头就可以了,比如以下两种方法是相同的:

 ~]$ [ 2 -eq 2 ]
 ~]$ echo $?
0
 ~]$ test 2 -eq 2
 ~]$ echo $?
0

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


这个测试命令可以配合if等命令进行条件判断,比如可以用vim写一个脚本:

#!/bin/bash
if [ 1 -eq 1 ] ; then
        echo "相同"
else echo "不相同"
fi
 ~]$ vim b1
 ~]$ bash b1
相同

然后改一个数,就会输出不相同:

#!/bin/bash
if [ 1 -eq 2 ] ; then
        echo "相同"
else echo "不相同"
fi
 ~]$ vim b1
 ~]$ bash b1
不相同

像其他测试的条件也可以写成这种脚本,就不一一列举了。




2.字符串测试:

 双目操作符:

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

    比如:

 ~]$ [ abc == abc ]
 ~]$ echo $?
0
 ~]$ [ abc == abd ]
 ~]$ echo $?
1

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

    这个符号的功能与==相反,比如

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

 >:被测试的两个字符串在ascll码表中对应的二进制数据,左边是否大于右边,大于为真,小于为假;

 <:被测试的两个字符串在ascll码表中对应的二进制数据,左边是否小于右边,小于为真,大于为假;

    比如:

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

 注意:<,>和下头的“=~”只在一个中括号里是不能执行的,只有在两个中括号的包裹下才能够执行。


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

 ~]$ [[ abc =~ abb ]]
 ~]$ echo $?
1
 ~]$ [[ abc =~ ab ]]
 ~]$ echo $?
0

    上头的两个例子的结果是因为abb不能匹配abc,而ab可以匹配abc


 单目操作符:

  -z ‘string‘:判断指定的字符串是否为空串;空为真,非空为假;

  -n ‘string‘:判断指定的字符串是否为非空串;非空为真,空为假;


  注意

   1.通常情况下,字符串要加引号,单引号,双引号,都行,根据实际情况;

   2.[[]]和[]在某些情况下,可能意义不同,要区分使用;

   3.表达式和操作符两段都要加空格;


3.文件状态测试:

 1)文件存在性测试

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

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

    (这两个功能相似)


  2)文件类型测试(测试存在性)

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

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

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

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

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

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

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


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

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

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

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


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

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

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

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


  5)文件所有权测试:

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

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


  6)文件内容是否为空:

  -s file:被测试的文件是否存在并且内容不为空,存在且内容不为空则为真;否则为假;

  

  7)时间戳测试:

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


  8)双目测试:

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

  

  9)硬链接;

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

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




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

    第一种表达式:

      [ -O /tmp/test ] && [ -s /tmp/test ]

      [ -O /tmp/test ] || [ -s /tmp/test ]

      

     第二种表达式:

      [ -O /tmp/test -a -s /tmp/test ]

      [ -O /tmp/test -o -s /tmp/test ]

      [ ! -O /tmp/test ]

    以上这两种表达式的作用是相同的



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

    0:成功

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

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

当我们查到了这些数字之后可以通过刚才执行的命令的帮助去查看每个数字对应到说明。在自己编写的脚本中也可以有返回值,使用“exit”命令,后头跟一个数字,就会返回这个数字。

注意:exit命令只能返回数字。

shell脚本编程之条件测试——test