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 $@
虽然在我看来,[-n $@]应该是假的,因为7.3其他比较运算符表示[ -n "$X" ]应该是所有$X的[ -z "$X" ]的反义词。
-z字符串为空,即为零长度。 字符串=‘’#零长度("null")字符串变量。如果-z "$String“,那么回显"\$String为null”。否则回显"\$String不为空“。fi # $String为空。-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发布于 2013-03-04 17:05:47
当$@为空时,"$@"不会展开为空字符串;它将被完全删除。所以你的测试不是
[ -n "" ]但更确切地说
[ -n ]现在,-n不是一个运算符,而是一个非空字符串,它总是测试为true。
发布于 2013-03-05 08:22:26
"$@"不做你想做的事。它不是一种不同形式的"$*",它扩展到引用的传递给当前脚本的参数列表。
如果没有争论,它就会扩大到一无所有。如果有两个参数a和b c,则扩展到"a" "b c" (即在参数中保留空格),"$*"扩展到"a b c",$*扩展到a b c (三个单词)。
https://stackoverflow.com/questions/15206840
复制相似问题