在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和[是相同的程序。
简而言之,[更好,因为它不会分叉另一个进程。 没有括号或单个括号比双括号慢,因为它分叉另一个进程。