function wtf() {
echo "\$*='$*'"
echo "\$@='$@'"
echo "\$@='"$@"'"
echo "\$@='""$@""'"
if [ -n "$*" ]; then echo " [ -n \$* ]"; else echo "![ -n \$* ]"; fi
if [ -z "$*" ]; then echo " [ -z \$* ]"; else echo "![ -z \$* ]"; fi
if [ -n "$@" ]; then echo " [ -n \$@ ]"; else echo "![ -n \$@ ]"; fi
if [ -z "$@" ]; then echo " [ -z \$@ ]"; else echo "![ -z \$@ ]"; fi
}
wtf
生产
$*='' $@='' $@='' $@='' ![ -n $* ] [ -z $* ] [ -n $@ ] [ -z $@ ]
尽管在我看来这[-n $@]
应该是错误的,因为7.3 其他比较运算符表明[ -n "$X" ]
应该是[ -z "$X" ]
for all的倒数$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]
我知道$@
它很特别,但我不知道它特别到足以违反布尔否定。这里发生了什么?
$ bash -version | head -1
GNU bash, version 4.2.42(2)-release (i386-apple-darwin12.2.0)
实际的数字退出代码是全部1
或0
按照
$ [ -n "$@" ]; echo "$?"
0