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)
Run Code Online (Sandbox Code Playgroud)-z string True if the length of string is zero. string -n string True if the length of string is non-zero.
我很困惑,它如何同时为零和非零?如何检查键是否具有值(使用bash)?
ilk*_*chu 14
[ .. ]遵循与所有其他命令相同的规则,即应用分词。如果OUT为空(或未设置),$OUT将扩展为空,甚至不是空参数。
因此,[ -n $OUT ]扩展为[,-n和],并[测试是否-n不是空字符串。是的,所以测试返回 true。
您需要引用$OUT,就像几乎所有其他地方一样:
if [ -n "$OUT" ]; then ...
Run Code Online (Sandbox Code Playgroud)
请参阅:何时需要双引号? 和试验和条件上BashGuide。
命令
[ -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 $OUT和test -n $OUT都将为 true,因为-z和-n都是非零长度的字符串。
要解决此问题,请用双引号引用变量扩展:
[ -n "$OUT" ]
Run Code Online (Sandbox Code Playgroud)
也可以看看