• 『忘了再学』Shell基础 — 32、Shell中test测试命令详解


    1、test测试命令

    (1)test命令介绍

    在Shell中的test测试命令,用于测试某种条件或某几种条件是否真实存在。

    在Shell中的test测试命令,是判断语句和循环语句中条件测试的工具。test命令经常用于对判断语句进行测试,用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。

    (2)test命令使用方式

    Shell中test命令的用法有两种:

    • 方式一:test expression
      test判断expression成立时,返回值状态为 0,否则为非 0 值。
      expression为表达式。
    • 方式二:test命令也可以简写为[ ]
      这时的test命令格式为:[ expression ]
      expression为表达式。
      注意:[]expression之间的空格,这两个空格是必须的,否则会导致语法错误。[]的写法更加简洁,比 test使用频率高。

    (3)示例

    需求:判断一个文件是否存在。

    shell
    # 说明:
    # -e 选项是test命令中判断文件是否存在的选项
    # test命令用命令行的方式执行是没有返回显示的,
    # 我们可以通过查看$?变量的方式,查看上一条命令是否正确执行。
    # 返回值为0,表示上一条命令正确执行,
    # 返回值为非0,表示上一条命令没有正确执行。
    
    # 判断一个文件是否存在
    # 方式一:
    [root@localhost tmp]# test -e student.txt
    # 结果为0,表示上一条命令正确执行,说明student.txt文件存在。
    [root@localhost tmp]# echo $?
    0
    
    # 方式二:
    [root@localhost tmp]# [ -e abc.txt ]
    # 结果为非0,表示上一条命令没有正确执行,说明abc.txt文件不存在。
    [root@localhost tmp]# echo $?
    1
    
    # 如果不想每次执行完test命令,还要查看$?变量,来确定命令是否正确实行,
    # 可以使用如下编写方式:(方式一同理)
    [root@localhost tmp]# [ -e abc.txt ] && echo yes || echo no
    no
    [root@localhost tmp]# [ -e student.txt ] && echo yes || echo no
    yes
    

    提示:在编写Shell程序时,一般都是使用第二种书写方式(没见过不一般的情况)。

    2、按照文件类型进行判断

    我们先来看看test可以进行哪些文件类型的判断:

    测试选项 作用
    -b 文件 判断该文件是否存在,并且是否为块设备文件(是块设备文件为真)。(少见)
    -c 文件 判断该文件是否存在,并且是否为字符设备文件(是字符设备文件为真)。(少见)
    -d 文件 判断该文件是否存在,并且是否为目录文件(是目录为真)。(常见)
    -e 文件 判断该文件是否存在(存在为真)。(常见)
    -f 文件 判断该文件是否存在,并且是否为普通文件(是普通文件为真)。(常见)
    -L 文件 判断该文件是否存在,并且是否为符号链接文件(是符号链接文件为真)。(常见)
    -p 文件 判断该文件是否存在,并且是否为管道文件(是管道文件为真)。(少见)
    -s 文件 判断该文件是否存在,并且是否为非空(非空为真)。
    -S 文件 判断该文件是否存在,并且是否为套接字文件(是套接字文件为真)。

    示例:

    Linux系统中tmp目录下的文件,情况如下:

    shell
    [root@localhost tmp]# ll
    总用量 12
    -rw-r--r--. 1 root root 371 10月 16 13:28 student.txt
    -rw-r--r--. 1 root root 318 10月 14 18:03 test2.txt
    -rw-r--r--. 1 root root  69 10月 16 17:39 test.txt

    练习:

    shell
    # 1.判断student.txt文件是否为目录
    [root@localhost tmp]# [ -d student.txt ] && echo yes || echo no
    no
    
    # 2.判断student.txt文件是否为普通文件
    [root@localhost tmp]# [ -f student.txt ] && echo yes || echo no
    yes
    
    # 3.判断student.txt文件是中内容是否为空
    [root@localhost tmp]# [ -s student.txt ] && echo yes || echo no
    yes
    
    # 我们创建一个空文件,在判断一次。
    [root@localhost tmp]# touch abc
    [root@localhost tmp]# [ -s abc ] && echo yes || echo no
    no
    
    
    # 注意:
    # 用命令行执行命令的时候可以写相对路径,因为我在对应的文件夹当中。
    # 而在编写Shell脚本的时候,文件名一定要加上绝对路径,要不然有可能找不到。

    3、按照文件权限进行判断

    test命令是非常完善的判断命令,还可以判断文件的权限,我们通过下表来看看:

    测试选项 作用
    -r 文件 判断该文件是否存在,并且是否该文件拥有读权限(有读权限为真)(常用)
    -w 文件 判断该文件是否存在,并且是否该文件拥有写权限(有写权限为真)(常用)
    -x 文件 判断该文件是否存在,并且是否该文件拥有执行权限(有执行权限为真)(常用)
    -u 文件 判断该文件是否存在,并且是否该文件拥有SUID权限(有SUID权限为真)(会用到)
    -g 文件 判断该文件是否存在,并且是否该文件拥有SGID权限(有SGID权限为真)(会用到)
    -k 文件 判断该文件是否存在,并且是否该文件拥有SBit权限(有SBit权限为真)

    示例:

    Linux系统中tmp目录下的文件,情况如下:

    shell
    [root@localhost tmp]# ll
    总用量 12
    -rw-r--r--. 1 root root 371 10月 16 13:28 student.txt
    -rw-r--r--. 1 root root 318 10月 14 18:03 test2.txt
    -rw-r--r--. 1 root root  69 10月 16 17:39 test.txt

    练习:

    shell
    # 1.查看tmp目录student.txt是否有写的权限
    # tmp目录student.txt文件权限如下:
    # -rw-r--r--. 1 root root 371 10月 16 13:28 student.txt
    [root@localhost tmp]# [ -w student.txt ] && echo yes || echo no
    yes
    # 上面证明在tmp目录中student.txt文件存在,并拥有写权限。
    
    # 注意:
    # -w选项是分不清是所有者,所数组,和其他人谁有写权限的,
    # 只要该文件任何一个身份中出现写的权限,-w选项的判断就是正确的。
    # 如果你非要判断某一个身份是否有写的权限,
    # 就需要我们自己手动把文件的权限按需求截取下来,然后编写程序来判断。
    
    # -r选项和-x选项同理。
    
    
    
    # 2.判断student.txt文件是否拥有SUID权限
    [root@localhost tmp]# [ -u student.txt ] && echo yes || echo no
    no
    
    # 可以看到student.txt文件没有设置SUID权限
    # 我们接下来给student.txt文件设置一下SUID权限
    
    [root@localhost tmp]# chmod u+s student.txt
    
    # 查看一下测试student.txt文件的权限
    [root@localhost tmp]# ll student.txt
    -rwSr--r--. 1 root root 371 10月 16 13:28 student.txt
    
    # 可以看到student.txt文件的权限中多了一个大S权限
    # 关于SUID权限相关内容可以点击如下链接进行查看:
    # https://blog.csdn.net/Liuyuelinjiayou/article/details/107197846
    # 接下来我们在判断student.txt文件受否拥有SUID权限
    [root@localhost tmp]# [ -u student.txt ] && echo yes || echo no
    yes
    
    # 练习完成后,尽量尽快的还原文件,一般之后的练习使用。
    [root@localhost tmp]# chmod u-s student.txt
    [root@localhost tmp]# ll student.txt
    -rw-r--r--. 1 root root 371 10月 16 13:28 student.txt

    4、两个文件之间进行比较

    通过下表来看看如何进行两个文件之间的比较(少用了解一下):

    测试选项 作用
    文件1 -nt 文件2 判断文件1的修改时间是否比文件2的新(如果新则为真)。
    文件1 -ot 文件2 判断文件1的修改时间是否比文件2的旧(如果旧则为真)。
    文件1 -ef 文件2 判断文件1是否和文件2的Inode号一致,可以理解为两个文件是否为同一个文件。这个用于判断硬链接是很好的方法。

    示例:

    shell
    # 把tmp目录下的student.txt文件,硬连接到root目录下student文件。
    # 也就是给tmp目录下的student.txt文件创建一个硬连接,在root目录下。
    [root@localhost tmp]# ln /tmp/student.txt  /root/student
    
    # 然后判断/tmp/student.txt文件和/root/student文件是否为同一文件。
    [root@localhost tmp]# [ /tmp/student.txt -ef /root/student ] && echo yes || echo no
    yes
    # 结果为是。

    5、两个整数之间比较

    通过下表来学习下如何在两个整数之间进行比较(常用):

    测试选项 作用
    整数1 -eq 整数2 判断整数1是否和整数2相等(相等为真)
    整数1 -ne 整数2 判断整数1是否和整数2不相等(不相等为真)
    整数1 -gt 整数2 判断整数1是否大于整数2(大于为真)
    整数1 -lt 整数2 判断整数1是否小于整数2(小于为真)
    整数1 -ge 整数2 判断整数1是否大于等于整数2(大于等于为真)
    整数1 -le 整数2 判断整数1是否小于等于整数2(小于等于为真)

    示例:

    shell
    # 1.-eq等于
    [root@localhost tmp]# [ 66 -eq 88 ] && echo yes || echo no
    no
    
    # 2.-lt小于
    [root@localhost tmp]# [ 66 -lt 88 ] && echo yes || echo no
    yes
    
    # 3.-le小于等于
    [root@localhost tmp]# [ 66 -le 88 ] && echo yes || echo no
    yes
    
    # 在Shell编程的时候,会把数值型变量引入条件判断表达式中,
    # 就不会是光突突的数字了。

    6、字符串的判断

    通过下表我们来学习下字符串的判断(常用):

    测试选项 作用
    -z 字符串 判断字符串是否为空(为空返回真)
    -n 字符串 判断字符串是否为非空(非空返回真)
    字符串1 == 字符串2 判断字符串1是否和字符串2相等(相等返回真)
    字符串1 != 字符串2 判断字符串1是否和字符串2不相等(不相等返回真)

    示例1:

    shell
    # 判断变量name是否为空
    [root@localhost tmp]# [ -z "$name" ] && echo yes || echo no
    yes
    
    # 给变量name赋值
    [root@localhost tmp]# name=Zhubj
    # 因为不为空,所以返回no
    [root@localhost tmp]# [ -z "$name" ] && echo yes || echo no
    no
    

    示例2:

    shell
    # 给变量aa和变量bb赋值
    [root@localhost tmp]# aa=Shell
    [root@localhost tmp]# bb=Shell
    
    # 判断变量aa和变量bb是否相等
    # 因为变量aa的值为"Shell",不等于字符串"bb",所以返回no。
    [root@localhost tmp]# [ "$aa" == "bb" ] && echo yes || echo no
    no
    
    # 变量aa和变量bb的值都为"Shell",所以返回yes。
    [root@localhost tmp]# [ "$aa" == "$bb" ] && echo yes || echo no
    yes
    

    提示:Shell中用==双等号来比对两个字符串是否相等(内容相同)。使用-eq来比对两个整数是否相等。

    7、多重条件判断

    通过下表来看看多重条件判断是什么样子的(常用):

    测试选项 作用
    判断1 -a 判断2 逻辑与,判断1和判断2都成立,最终的结果才为真。
    判断1 -o 判断2 逻辑或,判断1和判断2有一个成立,最终的结果就为真。
    ! 判断 逻辑非,使原始的判断式取反。

    也就是说多重条件判断就是,可以同时判断多个条件,前边的条件都可以。

    示例1:

    shell
    # 定义一个变量aa赋值并赋值66。
    [root@localhost tmp]# aa=66
    
    # 判断变量aa是否有值,同时判断变量aa的是否大于88。
    # 因为变量aa的值不大于88,所以虽然第一个判断值为真,返回的结果也是假。
    [root@localhost tmp]# [ -n "$aa" -a "$aa" -gt 88 ] && echo "yes" || echo "no"
    no
    
    
    # 给变量aa重新赋个大于88的值,返回结果就是yes了。
    [root@localhost tmp]# aa=99
    [root@localhost tmp]# [ -n "$aa" -a "$aa" -gt 88 ] && echo "yes" || echo "no"
    yes
    

    示例2:

    shell
    # 练习逻辑非
    # 说明:
    # "-n"选项是变量aa不为空,返回值就是真。
    # 加入"!"之后,判断值就会取反,所以当变量aa有值时,返回值是假.
    # "!"+"-n"选项就和"-z"选项作用一样了。
    [root@localhost tmp]# aa=99
    [root@localhost tmp]# [ ! -n "$aa" ] && echo "yes" || echo "no"
    no
    
    # 在定义一个没有赋值的变量cc,返回结果就是yes。
    [root@localhost tmp]# [ ! -n "$cc" ] && echo "yes" || echo "no"
    yes
    
    
    # 注意:"!""-n"选项之间必须加入空格,否则会报错的。

    __EOF__

  • 本文作者: 繁华似锦的博客
  • 本文链接: https://www.cnblogs.com/liuyuelinfighting/p/16377705.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    MYSQL用函数请三思
    FPGA之多路复选器1
    护眼灯买什么样的好?好用又实惠的护眼台灯推荐
    HTML+CSS大作业 格林蛋糕(7个页面) 餐饮美食网页设计与实现
    解密一致性哈希算法:实现高可用和负载均衡的秘诀
    stm32——hal库学习笔记(ADC)
    【硬件架构的艺术】学习笔记(2)同步和复位
    双指针——盛水最多的容器
    Python算法——最近公共祖先
    运行real.exe时出现NUM_METGRID_SOIL_LEVELS=0
  • 原文地址:https://www.cnblogs.com/liuyuelinfighting/p/16377705.html