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

ale*_*xus 6 string shell-script test variable

# 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
# 
Run Code Online (Sandbox Code Playgroud)

bash(1)

   -z string
          True if the length of string is zero.
   string
   -n string
          True if the length of string is non-zero.
Run Code Online (Sandbox Code Playgroud)

我很困惑,它如何同时为零非零?如何检查键是否具有值(使用bash)?

ilk*_*chu 14

[ .. ]遵循与所有其他命令相同的规则,即应用分。如果OUT为空(或未设置),$OUT将扩展为空,甚至不是空参数。

因此,[ -n $OUT ]扩展为[,-n],并[测试是否-n不是空字符串。是的,所以测试返回 true。

您需要引用$OUT,就像几乎所有其他地方一样:

if [ -n "$OUT" ]; then ...
Run Code Online (Sandbox Code Playgroud)

请参阅:何时需要双引号?试验和条件上BashGuide。


Kus*_*nda 5

命令

[ -z $OUT ]
Run Code Online (Sandbox Code Playgroud)

完全等于

test -z $OUT
Run Code Online (Sandbox Code Playgroud)

如果$OUT为空,则与

test -z
Run Code Online (Sandbox Code Playgroud)

的行为取决于命令行上给出的test 参数数量。如果仅给出单个参数(如test -nor中test -z),并且该参数的长度(当解释为字符串时)非零,则结果将为“true”。

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

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

[ -n "$OUT" ]
Run Code Online (Sandbox Code Playgroud)

也可以看看