bash - 如果字符串的长度为零(非)零,则为真?

bash - 如果字符串的长度为零(非)零,则为真?
# 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 -nor中),test -z并且该参数的长度(当解释为字符串时)非零,则结果将为“true”。

这意味着如果$OUT为空且未加引号,则test -z $OUTtest -n $OUT都将为 true,因为-z-n都是非零长度的字符串。

要解决此问题,请用双引号引用变量扩展:

[ -n "$OUT" ]

也可以看看

相关内容