在Bash中,]优于吗?

一位同事最近在一篇代码审查中声称, [[ ]]结构在结构中比[ ]要优先

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

他无法提供一个理由。 有一个吗?

[[有更less的惊喜,通常更安全的使用。 但它不是可移植的 – POSIX没有指定它的作用,只有一些shell支持它(除了bash,我听说ksh也支持它)。 例如,你可以做

 [[ -e $b ]] 

testing一个文件是否存在。 但是用[ ,你必须引用$b ,因为它分裂了论证,并扩展了像"a*" (其中[[从字面上理解])的东西。 这也与[如何可以是外部程序并像其他程序一样正常接受其参数(尽pipe它也可以是内置的,但是仍然没有这种特殊的处理)相关。

[[也有其他一些很好的function,比如正则expression式与=~匹配,还有像C语言那样的运算符。 这里有一个很好的网页: testing, [[[ ? 和Bashtesting

[[ ]]有更多的function – 我build议你看看高级Bash脚本指南了解更多信息,特别是第7章中的扩展testing命令部分。

顺便提一下,作为指南,ksh88(Korn shell的1988版本)引入了[[ ]]

哪个比较器,testing,支架或双支架最快? ( http://bashcurescancer.com

双括号是一个“复合命令”,其中test和single括号是shell内置的(实际上是相同的命令)。 因此,单支架和双支架执行不同的代码。

testing和单个括号是最便携的,因为它们作为单独的和外部的命令而存在。 但是,如果您使用任何远程现代版本的BASH,则支持双括号。

[[]]双括号在某些版本的SunOS下不被导入,在函数声明中完全不被导入:GNU bash,版本2.02.0(1) – 释放(sparc-sun-solaris2.6)

一个典型的情况,你不能使用[[是在一个autotools configure.ac脚本,括号有一个特殊的和不同的含义,所以你将不得不使用test而不是[或[[注意testing和[是相同的程序。

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