从man test
页面:
-n STRING
the length of STRING is nonzero
STRING equivalent to -n STRING
-z STRING
the length of STRING is zero
执行[ -n $foo ]
、、、、[ -n ]
均[ -z $foo ]
返回[ -z ]
true。这只是草率的返回值吗?未设置的变量不是字符串。表达式的完全省略也不是。即使它以某种方式“强制”为一,我也不愿意认为它的长度可以同时为零和非零。
确实,两者
if [ -n ] && [ -z ]; then
echo 1;
fi
# AND
if [ -n $foo ] && [ -z $foo ]; then
echo 1;
fi
...两者都产生"1"
。为什么?这里到底发生了什么?
答案1
问题
您误解了测试条件的解析方式。
首先 bash 确定参数的数量:
[
和之间没有任何内容]
是假的- 它们之间只有一个参数(不是空参数)总是
true
,无论参数的内容是什么;false
如果参数为空 ([ '' ]
) - 仅当有多个参数时,shell 才会查看内容。
-z
并-n
需要第二个参数。由于您的情况没有,因此它们不会被视为-z
/ -n
,而是被视为导致true
.
解决方案
你必须引用你的变量(就像你几乎总是应该做的那样)。然后,空变量将被视为空参数,而不是被完全删除。