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