# touch $$
# gzip $$
# gzip --test $$.gz
# echo $?
0
# OUT=$(gzip --test $$.gz)
# echo $OUT
# if [ -z $OUT ] ; then echo $$ ; fi
26521
# if [ -n $OUT ] ; then echo $$ ; fi
26521
#
从bash(1)
-z string True if the length of string is zero. string -n string True if the length of string is non-zero.
我很困惑,怎么会是零呢?和同时非零?如何检查 key 是否有值(使用bash
)?
答案1
[ .. ]
遵循与所有其他命令相同的规则,即分词适用。如果OUT
为空(或未设置),$OUT
将扩展为空,甚至不是空参数。
因此,[ -n $OUT ]
扩展为[
、-n
和]
,并[
测试是否-n
不是空字符串。是的,所以测试返回 true。
您需要引用$OUT
,就像其他地方一样:
if [ -n "$OUT" ]; then ...
看:什么时候需要双引号? 和测试和条件在 BashGuide 上。
答案2
命令
[ -z $OUT ]
完全等于
test -z $OUT
如果$OUT
为空,则与
test -z
的行为test
取决于参数的数量在命令行上给出。如果仅给出单个参数(如test -n
or中),test -z
并且该参数的长度(当解释为字符串时)非零,则结果将为“true”。
这意味着如果$OUT
为空且未加引号,则test -z $OUT
和test -n $OUT
都将为 true,因为-z
和-n
都是非零长度的字符串。
要解决此问题,请用双引号引用变量扩展:
[ -n "$OUT" ]
也可以看看