【问题标题】:BASH: [ ] (test) behaves unconformlyBASH:[ ](测试)行为不规范
【发布时间】:2011-10-25 13:29:04
【问题描述】:

在我的 bash 中,test 有一种以状态 0 退出的态度:

$ test -n && echo true || echo false
-> true

同时

$ test -n "" && echo true || echo false
-> false

这意味着当它根本没有收到任何参数时,它假定非零。

案例-z 可以正常工作:

$ test -z && echo true || echo false
-> true
$ test -z "" && echo true || echo false
-> true

这是预期的行为吗?

【问题讨论】:

  • 好问题。我还想知道为什么test -ntest -z(不带参数)都成功了。
  • 请注意&&||!试试这个代码:touch ~/x && touch /x || echo fail - 如果touch /x 失败,fail 将被打印出来!

标签: linux bash gnu


【解决方案1】:

基本上,您是在询问字符串“-z”是否为非空。是的,所以它告诉你true。实际算法测试使用的是:

  • 0 个参数:

    退出假 (1)。

  • 1 个参数:

    如果 $1 不为空,则退出 true (0);否则,退出false。

  • 2 个参数:

    如果 $1 是 '!',如果 $2 为空则退出 true,如果 $2 不为空则退出 false。

    如果 $1 是一元主要,则退出 true 如果一元测试为真,则为假 如果一元测试为假。

    否则,会产生未指定的结果。

...

引用自the POSIX test command specification

【讨论】:

    【解决方案2】:

    大概,没有参数的“-n”和“-z”不被视为运算符,而只是字符串,test "a non-empty string" 是真的。我猜test 将其参数计数为第一步,如果计数为 1,则只需检查参数的长度。

    【讨论】:

    • 这是一个很好的解释。实际上,这个理论是有效的,并且与手册没有对比,手册没有规定参数在参数之前被解释。
    【解决方案3】:

    是的,这是预期的。

    $ man test
    -n string                   True if the length of string  is
                                 non-zero.
    -z string                   True if  the  length  of  string
                                 string is zero.
    

    test [option] #without any operand 返回一个退出状态,该状态适用于 ALL 选项。

    试试这些:

    test -d
    test -f
    test -n
    test -G
    test -k
    ...
    

    【讨论】:

    • 这对 OP 没有帮助。 OP 知道它是如何工作的 with 一个论点。问题是关于-n 没有参数 的行为以及为什么它被认为是true
    • 并非如此,使用运算符进行测试并且不使用操作数对所有选项返回 true。我编辑了回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 2017-04-09
    • 1970-01-01
    • 1970-01-01
    • 2013-07-06
    相关资源
    最近更新 更多