Shell 脚本成长笔记

Shell 使用 test 命令

2017-04-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命令行及脚本编程实例详解

上一篇下一篇

猜你喜欢

热点阅读