[
命令,通常被称为 “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 条评论