一位同事最近在一次代码评审中声称,在类似于

if [ "`id -nu`" = "$someuser" ] ; then
     echo "I love you madly, $someuser"
fi

他无法提供理由。有吗?


当前回答

某些版本的SunOS不支持[[]]双括号,函数声明中完全不支持:

GNUBash,版本2.02.0(1)-发布(sparc-sun-solaris2.6)

其他回答

我感到惊讶的是,我没有看到这个问题提前提出,但请考虑:

$ n=5
$ [[ $n -gt 0 ]] && echo $n is positive
5 is positive
$ n=foo
$ [[ $n -gt 0 ]] && echo $n is positive
$ [ "$n" -gt 0 ] && echo $n is positive
bash: [: foo: integer expression expected

行[[$n-gt 0]]中缺少错误消息,导致[[完全不可用。也许我太苛刻了,正确的答案是避免在[[中进行整数比较,但我强烈建议不要使用[[。

[[的惊喜更少,使用起来更安全。但它不是可移植的-POSIX没有指定它做什么,只有一些shell支持它(除了bash,我听说ksh也支持它)

[[ -e $b ]]

测试文件是否存在。但是对于[,你必须引用$b,因为它拆分了参数并扩展了像“a*”这样的东西(其中[[是字面意思)。这也与[如何可以是一个外部程序并像其他程序一样正常地接收其参数有关(虽然它也可以是内置的,但它仍然没有这种特殊的处理)。

[[还有一些其他不错的特性,比如正则表达式与=~匹配,以及类似C语言中的运算符。这里有一个很好的页面:test、[[?和Bash Tests之间的区别是什么

哪个比较器、测试、括号或双括号最快?:

双括号是“复合”命令“where as test and the single支架是外壳内置的(和现实是相同的命令)。因此单支架和双支架执行不同的代码。测试和单个支架是最便携的单独和外部命令。但是,如果您远程使用现代版BASH,双人支架得到支撑。

简而言之,[[更好,因为它不会分叉另一个进程。没有括号或单括号比双括号慢,因为它分叉另一进程。

无法使用[[的典型情况是在autotools configure.ac脚本中。括号具有特殊和不同的含义,因此必须使用test而不是[[或[[--请注意,test和[是同一个程序。