为什么 [ -n ] 不像 [ -n "" ] 那样为 false?

为什么 [ -n ] 不像 [ -n "" ] 那样为 false?

我的问题是关于此代码生成的返回值:

if [ -n ]; then echo "true"; else echo "false"; fi

这打印true.

其补充测试[ -z ]还使用打印true

if [ -z ]; then echo "true"; else  echo "false"; fi

在上面的代码中,为什么[ -n ]测试假设根本没有传递的字符串值不为空?

下面的代码打印false.这是预期的,因为传递的字符串值为空且长度为零。

if [ -n "" ]; then echo "true"; else  echo "false"; fi

答案1

[ -n ]不使用-n测试。

-nin根本[ -n ]不是一个测试。当[和之间只有一个参数时],该参数是一个字符串,将测试它是否为空。即使该字符串具有前导-,它仍然被解释为操作数,而不是测试。由于字符串-n不为空——它包含两个字符,-并且n不是零个字符——[ -n ]计算结果为真。

作为伊格纳西奥·巴斯克斯·艾布拉姆斯 说, 在哪里string是一个参数,测试执行于stringin与 对其执行的测试相同。什么时候[ string ][ -n string ]string碰巧是-n,没有什么特别的事情发生。 in和第二个in只是测试是否为空的字符串-n[ -n ]-n[ -n -n ]

[当和之间只有一个参数时],该参数始终是要测试非空性的字符串,即使它碰巧与测试命名相同。类似地,当 和 之间有两个参数并且其中第一个参数[]-n,第二个参数始终是要测试非空性的字符串,即使它碰巧与测试命名相同。这只是因为 for 的语法坚持认为 和 之间或之后的[单个参数是字符串操作数。[]-n

出于同样的原因,[ -n ]不使用-n测试,[ -z ]不使用-z测试。


您可以通过查看它的帮助来了解有关[in 的更多信息。bash请注意,这是一个外壳内置

$ type [
[ is a shell builtin

因此,您可以运行help [以获得有关它的帮助:

$ help [
[: [ arg... ]
    Evaluate conditional expression.

    This is a synonym for the "test" builtin, but the last argument must
    be a literal `]', to match the opening `['.

有关更多信息,包括支持哪些测试以及它们如何工作,您必须查看 上的帮助test。当您运行该命令时help test,您将获得详细列表。下面是关于字符串运算符的部分,而不是全部重现:

      -z STRING      True if string is empty.

      -n STRING
         STRING      True if string is not empty.

      STRING1 = STRING2
                     True if the strings are equal.
      STRING1 != STRING2
                     True if the strings are not equal.
      STRING1 < STRING2
                     True if STRING1 sorts before STRING2 lexicographically.
      STRING1 > STRING2
                     True if STRING1 sorts after STRING2 lexicographically.

请注意,-n STRING只需STRING执行相同的操作:它们测试字符串是否STRING不为空。

答案2

[X]相当于[ -nX]即使X-如果没有操作数,则从 开始。

$ [ -o ] ; echo $?
0
$ [ -eq ] ; echo $?
0
$ [ -n -o ] ; echo $?
0
$ [ -n -eq ] ; echo $?
0

答案3

[ -n ]为真,因为[命令(又名test命令)作用于数字给出的论点。如果仅给出一个参数,且参数为非空字符串,则结果为“true”。 “-n”是一个包含 2 个字符的字符串,非空,因此“true”。

相关内容