function wtf() {
echo "\$*='$*'"
echo "\[email protected]='[email protected]'"
echo "\[email protected]='"[email protected]"'"
echo "\[email protected]='""[email protected]""'"
if [ -n "$*" ]; then echo " [ -n \$* ]"; else echo "![ -n \$* ]"; fi
if [ -z "$*" ]; then echo " [ -z \$* ]"; else echo "![ -z \$* ]"; fi
if [ -n "[email protected]" ]; then echo " [ -n \[email protected] ]"; else echo "![ -n \[email protected] ]"; fi
if [ -z "[email protected]" ]; then echo " [ -z \[email protected] ]"; else echo "![ -z \[email protected] ]"; fi
}
wtf
产生
$*='' [email protected]='' [email protected]='' [email protected]='' ![ -n $* ] [ -z $* ] [ -n [email protected] ] [ -z [email protected] ]
虽然在我看来,[-n [email protected]]
应该是假的,因为7.3 Other Comparison Operators表明[ -n "$X" ]
应对所有的$X
来说都是[ -z "$X" ]
的倒数。
-z
字符串为空,即,具有零长度
String='' # Zero-length ("null") string variable. if [ -z "$String" ] then echo "\$String is null." else echo "\$String is NOT null." fi # $String is null.
-n
串不为空。
-n
测试要求在测试括号内引用该字符串。但是,使用带引号的字符串! -z
,或者甚至仅仅在测试括号内仅引用未加引号的字符串(请参见示例7-6)通常有效,但这是不安全的做法。总是引用测试过的字符串。 [1]
我知道[email protected]
是特殊的,但我不知道它是特殊的,足以违反布尔否定。这里发生了什么?
$ bash -version | head -1
GNU bash, version 4.2.42(2)-release (i386-apple-darwin12.2.0)
实际数字退出代码都是1
或0
按照
$ [ -n "[email protected]" ]; echo "$?"
0
好的。所以'$ @'是一些词汇语法糖,它明显地触发了“-n'测试要求字符串被引用”警告。 – 2013-03-04 17:07:49
这就是为什么我坚持'[['在bash中。 – choroba 2013-03-04 17:07:49
@choroba:我只是验证'[[...]]'很聪明,看到'-n'缺少它的参数。 – chepner 2013-03-04 17:08:59