一位同事最近在一次代码评审中声称,在类似于
if [ "`id -nu`" = "$someuser" ] ; then
echo "I love you madly, $someuser"
fi
他无法提供理由。有吗?
一位同事最近在一次代码评审中声称,在类似于
if [ "`id -nu`" = "$someuser" ] ; then
echo "I love you madly, $someuser"
fi
他无法提供理由。有吗?
当前回答
我感到惊讶的是,我没有看到这个问题提前提出,但请考虑:
$ 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]]中缺少错误消息,导致[[完全不可用。也许我太苛刻了,正确的答案是避免在[[中进行整数比较,但我强烈建议不要使用[[。
其他回答
[[]]有更多功能-我建议您查看《高级Bash脚本指南》以了解更多信息,特别是第7章中的扩展测试命令部分。测验。
顺便说一下,正如指南所指出的,[[]]是在ksh88(1988年版的KornShell)中引入的。
无法使用[[的典型情况是在autotools configure.ac脚本中。括号具有特殊和不同的含义,因此必须使用test而不是[[或[[--请注意,test和[是同一个程序。
某些版本的SunOS不支持[[]]双括号,函数声明中完全不支持:
GNUBash,版本2.02.0(1)-发布(sparc-sun-solaris2.6)
哪个比较器、测试、括号或双括号最快?:
双括号是“复合”命令“where as test and the single支架是外壳内置的(和现实是相同的命令)。因此单支架和双支架执行不同的代码。测试和单个支架是最便携的单独和外部命令。但是,如果您远程使用现代版BASH,双人支架得到支撑。
如果你喜欢遵循谷歌的风格指南:
测试、[…]和[[…]][[…]]优先于[…]、test和/usr/bin/[。[[…]]减少了错误,因为[[和]]之间不发生路径名扩展或单词分割。此外,[[…]]允许正则表达式匹配,而[…]不允许。#这确保了左侧的字符串由#后跟字符串名称的alnum字符类。#注意,此处不应引用RHS。如果[[“文件名”=~^[[:alnum:]]+名称]];然后echo“匹配”传真#这与确切的模式“f*”匹配(在这种情况下不匹配)如果[[“filename”==“f*”]];然后echo“匹配”传真#当f*扩展到#当前目录的内容如果[“filename”==f*];然后echo“匹配”传真有关血腥的详细信息,请参见E14http://tiswww.case.edu/php/chet/bash/FAQ