从历史上看,该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没有算术表达式,但是它有exprcommand,它还对整数运算(包括比较运算符)实现了类似于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