我想知道为什么会出现这种情况。
test -n
比如返回“true”:
if test -n; then echo "yes" ; else echo "no" ; fi
即使在使用选项 -n 并将空字符串作为参数传递时,它仍会打印 "yes"。此选项检查字符串长度是否为 0(返回 false)或其他字符数(返回 true)。感谢您的使用。
test -n
比如返回“true”:
if test -n; then echo "yes" ; else echo "no" ; fi
即使在使用选项 -n 并将空字符串作为参数传递时,它仍会打印 "yes"。此选项检查字符串长度是否为 0(返回 false)或其他字符数(返回 true)。感谢您的使用。
从文档中得知:
test
和[
内置命令使用一组基于参数数量的规则来评估条件表达式。0 个参数: 表达式为 false。
1 个参数: 当且仅当参数不为空时,表达式为 true。
在您的情况下,您只有一个非空参数 (-n
)。
它之所以返回true,与test x
返回true的原因相同 - 字符串-n
是非空的。它没有使用-n
选项,因为-n
需要第二个参数,而您没有提供。
test -n "" || echo false
x=""
test -n $x && echo true
test -n "$x" || echo false
让我们更加具体地说。考虑一下这个脚本:
if [ -n $myvar ]
then
echo true
else
echo false
注意,myvar未定义。脚本打印出“true”,这是不符合预期的。 现在将$myvar更改为“$myvar”。脚本打印出“false”,这是有道理的。还要注意
测试$myvar
也打印出false,如预期所示。 这种差异在bash文档或关于此观察的众多SO帖子中都没有解释。引号应该使bash将变量内容视为单个字符串,但在这里不适用。 请帮忙,谢谢。