[ 命令,通常被称为 “test”,是 GNU Core Utils 包中的一个命令,用于在 Bash 中启动条件语句。它的功能与 test 命令完全相同。当您只想在某个条件为真或假时执行命令,请使用 [ 或 test 命令。然而,[ 或 test 与 [[ 之间存在显著差异,并且这些命令与 shell 自身版本之间也存在技术差异。
Linux 中的 [ 与 test 命令
由 GNU Core Utils 包安装的 [ 和 test 命令使用略有不同的语法执行相同的功能。(您可能会发现使用单个左方括号字符搜索文档很困难,因此许多用户觉得 test 更容易参考。)Bash 和类似的 shell 恰好也内置了 [ 和 test 命令,并且内置版本取代了安装在 /usr/bin 中的版本。换句话说,当您使用 [ 或 test 时,您可能不是在执行 /usr/bin/[ 或 /usr/bin/test。相反,您调用的是 Bash shell 的一个基本功能。
您可能想知道为什么 [ 或 test 会存在于 /usr/bin 中。某些 shell,例如 tcsh,没有内置 [ 和 test,因此如果您想在该 shell 中使用这些命令,您必须将它们安装为单独的二进制文件。
底线是,只要您在键入以 [ 或 test 开头的命令时没有收到错误,那么您就拥有所需的一切。您的 shell 或 bin 目录提供这些命令几乎无关紧要。
测试文件是否存在
通常需要知道文件是否存在,通常是为了您可以自信地继续执行某些操作,或者为了避免用同名文件“覆盖”它。在交互式 shell 会话中,您可以直接查看文件是否存在,但在 shell 脚本中,您需要计算机自行确定。-e 选项测试文件是否存在,但其表面响应无论哪种方式都是相同的。
$ touch example
$ test -e example
$ test -e notafile
$[ 和 test 命令本质上是开关。它们发出 true 或 false 响应,但都将其视为成功。您可以通过将命令与逻辑运算符(例如 && 和 ||)配对来使用它。当响应为 true 时,执行 && 运算符
$ touch example
$ test -e example && echo "foo"
foo
$ test -e notafile && echo "foo"
$当响应为 false 时,执行 || 运算符
$ touch example
$ test -e example || echo "foo"
$ test -e notafile || echo "foo"
foo
$如果您愿意,可以使用方括号代替 test。在所有情况下,结果都是相同的
$ touch example
$ [ -e example ] && echo "foo"
foo
$ [ -e notafile ] && echo "foo"
$测试文件类型
Linux 中的一切都是文件,因此当您可以使用 -e 选项测试目录是否存在时,测试文件的方式也是相同的。但是,文件类型不同,有时这很重要。您可以使用 [ 或 test 来检测各种不同的文件类型
- 
-f:常规文件(对于目录返回false)
- 
-d:目录
- 
-b:块设备(例如/dev/sda1)
- 
-L或-h:符号链接
- 
-S:套接字
还有更多,但这些往往是最常见的。
测试文件属性
您还可以查看文件的元数据
- 
-s:大小大于零的文件
- 
-N:自上次读取以来已修改的文件
您可以按所有权进行测试
- 
-O:当前主用户拥有的文件
- 
-G:当前主组拥有的文件
或者您可以按权限(或文件模式)进行测试
- 
-r:授予读取权限的文件
- 
-w:授予写入权限的文件
- 
-x:授予执行权限的文件
- 
-k:设置了粘滞位的文件
组合测试
您不必总是只测试单个属性。-a 选项(“and”)允许您将多个测试串在一起,要求所有测试都返回 true
$ touch zombie apocalypse now
$ test -e zombie -a -e apocalypse -a -e now && echo "no thanks"
no thanks如果任何表达式失败,则测试返回 false
$ touch zombie apocalypse now
$ test -e plant -a -e apocalypse -a -e now && echo "no thanks"
$-o 选项(“or”)要求一个表达式为真
$ touch zombie apocalypse now
$ test -e zombie -o -e plant -o -e apocalypse && echo "no thanks"
no thanks整数测试
您还可以测试整数。这不一定直接有用(您可能天生就知道 0 小于 1,例如),但当您在脚本中使用变量时,它非常宝贵。
一旦您理解了模式,这些运算符就相当直观
- 
-eq:等于
- 
-ne:不等于
- 
-ge:大于或等于
- 
-gt:大于
- 
-le:小于或等于
- 
-lt:小于
这是一个简单的例子
$ nil=0
$ foo=1
$ test $foo -eq $nil || echo "Those are not equal."
Those are not equal.
$ test $foo -eq 1 && echo "Those are equal."当然,您可以组合测试。
$ touch example
$ test $foo -ne $nil -a -e example -o -e notafile && echo "yes"
yes测试测试
[ 和 test 命令是在脚本编写中至关重要的条件语句。这些是控制代码流程的简单且常见的方法。可用的测试比我在本文中介绍的还要多,因此无论您使用 Bash、tcsh、ksh 还是其他 shell,请查看手册页以获取这些命令提供的完整范围。
 
 
 
 
 

2 条评论