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
复制相似问题