从历史上看,该test
命令首先存在(至少可以追溯到1979年的Unix第七版)。它使用了运营商=
和!=
比较字符串,并且-eq
,-ne
,-lt
等来比较数字。例如,test 0 = 00
为false,但test 0 -eq 00
为true。我不知道为什么选择这种语法,但是它可能是避免使用<
and >
,shell会将其解析为重定向运算符。test
几年后,该命令有了另一种语法:[ … ]
等效于test …
。
的[[ … ]]
条件的语法,在其内部<
和>
可以用作操作者无需引用,后来被加入,在ksh中。它保持与的向后兼容性[ … ]
,因此使用相同的运算符,但添加了<
并>
比较了字符串(例如[[ 9 > 10 ]]
but [[ 9 -lt 10 ]]
)。有关更多信息,请参见使用单括号或双括号-bash
在1980年代的某个时候test
,在Korn shell中,算术表达式也比命令晚。他们遵循C语言的语法,C语言在Unix界很流行。因此,他们用c的运算符:==
为平等,<=
对于较少的或相等的等
Unix Seventh Edition没有算术表达式,但是它有expr
command,它还对整数运算(包括比较运算符)实现了类似于C的语法。在shell脚本中,必须加上<
和字符>
以保护它们不受shell的影响,例如if expr 1 \< 2; …
等价于if test 1 -lt 2; …
。在外壳上添加算术表达式使大多数使用expr
作废了,因此今天它并不为人所知。
在sh脚本中,通常会使用算术表达式来计算整数值,并[ … ]
比较整数。
if [ "$((x + y))" -lt "$z" ]; then …
在ksh,bash或zsh脚本中,((…))
两者都可以使用。
if ((x + y < z)); then …
[[ … ]]
如果要使用涉及整数以外的条件的条件,则该表格很有用。
= != < <= > >=
比较字符串。1 -eq 01
但是1 != 01
,8 -lt 42
但是8 > 42