为什么在bash中'test -n'返回'true'?

4
我想知道为什么会出现这种情况。
test -n

比如返回“true”:

if test -n; then echo "yes" ; else echo "no" ; fi

即使在使用选项 -n 并将空字符串作为参数传递时,它仍会打印 "yes"。此选项检查字符串长度是否为 0(返回 false)或其他字符数(返回 true)。感谢您的使用。

3个回答

5

从文档中得知:

test[ 内置命令使用一组基于参数数量的规则来评估条件表达式。

0 个参数: 表达式为 false。

1 个参数: 当且仅当参数不为空时,表达式为 true。

在您的情况下,您只有一个非空参数 (-n)。


3

它之所以返回true,与test x返回true的原因相同 - 字符串-n是非空的。它没有使用-n选项,因为-n需要第二个参数,而您没有提供。

test -n  ""  || echo false
x=""
test -n  $x  && echo true
test -n "$x" || echo false

每个echo命令都会被执行;特别注意中间的那个!

0

让我们更加具体地说。考虑一下这个脚本:

if [ -n $myvar ]
then
     echo true
else
     echo false

注意,myvar未定义。脚本打印出“true”,这是不符合预期的。 现在将$myvar更改为“$myvar”。脚本打印出“false”,这是有道理的。还要注意

测试$myvar

也打印出false,如预期所示。 这种差异在bash文档或关于此观察的众多SO帖子中都没有解释。引号应该使bash将变量内容视为单个字符串,但在这里不适用。 请帮忙,谢谢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接