Shell 使用 test 命令

作者: 赵者也 | 来源:发表于2017-04-08 20:08 被阅读4次

    Shell 脚本可以使用条件逻辑,使脚本可以根据参数、Shell 变量或是其他条件的值采取不同的行动。test 命令允许你做各种测试并在测试成功或失败时返回它的退出状态码(为0表示为真,为1表示为假)。使用这个状态码,可以让 Bash 对测试的结果做出反应。

    test 命令可以用于:

    1. 文件属性测试;
    2. 字符串测试;
    3. 算术测试。

    test 命令的语法为:

    test EXPRESSION
    

    [ EXPRESSION ]
    

    下面是几个简单的示例:


    使用示例

    上述实例中的第一个是文件属性的测试,使用 -d 操作符测试变量 $HOME 的值(当前账号的 HOME 目录)是否为一个目录并且此目录是否存在,此例中的退出状态码为 0,表示存在此目录。第二个实例是字符串的比较,使用 “!=” 操作符比较两个字符串是不是不相等,此例中的退出状态码为 0,表示两个字符串不相等。最后一个实例是算术比较,使用 “-gt” 操作符比较第一个数是否大于第二个数,如果大于,则输出 True,否则打印 False。

    文件属性测试操作符表###

    操作符 描述
    -e <FILE> 如果 <FILE> 存在则为真
    -f <FILE> 如果 <FILE> 存在且是一个常规文件则为真
    -d <FILE> 如果 <FILE> 存在且是一个目录则为真
    -c <FILE> 如果 <FILE> 存在且是一个特殊字符文件则为真
    -b <FILE> 如果 <FILE> 存在且是一个特殊块文件则为真
    -p <FILE> 如果 <FILE> 存在且是一个命名管道则为真
    -S <FILE> 如果 <FILE> 存在且是一个套接字文件则为真
    -L <FILE> 如果 <FILE> 存在且是一个符号链接则为真(与 -h 相同)
    -h <FILE> 如果 <FILE> 存在切实一个符号链接则为真(与 -L 相同)
    -g <FILE> 如果 <FILE> 存在且是设置了 sgid 位则为真
    -u <FILE> 如果 <FILE> 存在且是设置了 suid 位则为真
    -r <FILE> 如果 <FILE> 存在且是可读的则为真
    -w <FILE> 如果 <FILE> 存在且是可写的则为真
    -x <FILE> 如果 <FILE> 存在且是可执行的则为真
    -s <FILE> 如果 <FILE> 存在且不为空则为真
    -t <fd> 如果文件描述符 <fd> 已打开且引用了一个终端则为真
    <FILE1> -nt <FILE2> 如果 <FILE1> 比 <FILE2> 新则为真(指 mtime)
    <FILE1> -ot <FILE2> 如果 <FILE1> 比 <FILE2> 旧则为真(指 mtime)
    <FILE1> -ef <FILE2> 如果 <FILE1> 有硬链接到 <FILE2> 则为真

    实例 1,检查文件是否存在:


    检查文件是否存在

    注意:上述命令语句中的 “$_” 表示前一个执行的命令中的最后一个参数。

    字符串测试操作符表###

    操作符 描述
    -z <STRING> 如果 <STRING> 为空则为真
    -n <STRING> 如果 <STRING> 不为空则为真
    <STRING1> = <STRING2></br><STRING1> != <STRING2></br><STRING1> \< <STRING2></br><STRING1> \> <STRING2> 字符串比较 ASCII 码顺序

    算术测试操作符表###

    操作符 描述
    <INTEGER1> -eq <INTEGER2> 如果 <INTEGER1> 与 <INTEGER2> 相等则为真
    <INTEGER1> -ne <INTEGER2> 如果 <INTEGER1> 与 <INTEGER2> 不相等则为真
    <INTEGER1> -le <INTEGER2> 如果 <INTEGER1> 小于或等于 <INTEGER2> 则为真
    <INTEGER1> -ge <INTEGER2> 如果 <INTEGER1> 大于或等于 <INTEGER2> 则为真
    <INTEGER1> -lt <INTEGER2> 如果 <INTEGER1> 小于 <INTEGER2> 则为真
    <INTEGER1> -gt <INTEGER2> 如果 <INTEGER1> 大于 <INTEGER2> 则为真

    在 Bash 中还有一个 “[[]]” 关键字,它是 “[]” 的提高版本:

    [[ EXPRESSION ]]
    

    但是 “[[]]” 关键字仅在 Bash、Zsh 和 Korn Shell 中可用,而 “[]” 几乎可以在任意一种 Shell 下(只要符合 POSIX 标准)使用。尽管 “[[]]” 和 “[]” 有许多共同点,它们共有很多表达式操作符,如 -f、-s、-n 和 -z 等,但它们还有一些明显的不同。

    “[[]]” 和 “[]” 之间不同的比较###

    Feature [[]] [] Example
    String comparison > < \> \< [[ a > b ]]</br>[ a \> b]
    Expression grouping (...) (...) [[ $var=img* && ($var = *.png $var = *.jpg ]]
    Pattern matching = (not available) [[ $name = a* ]]
    RegularExpression matching =~ (not available) [[ $(date) =~ ^Fri...\13]]

    本文参考自 《Linux Shell命令行及脚本编程实例详解

    相关文章

      网友评论

        本文标题:Shell 使用 test 命令

        本文链接:https://www.haomeiwen.com/subject/acilattx.html