BASH:[ ](测试)行为不一致

发布于 2024-12-11 19:27:27 字数 471 浏览 0 评论 0原文

在我的 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

这是预期的行为吗?

In my bash test has an attitude to exit with status 0:

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

while

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

It means when it doesn't receive any argument at all, it assumes nonzero.

The case -z works properly instead:

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

Is this the expected behavior?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

赴月观长安 2024-12-18 19:27:27

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

  • 0 个参数:

    退出 false (1)。

  • 1 个参数:

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

  • 2 个参数:

    如果 $1 为“!”,则如果 $2 为 null,则退出 true;如果 $2 不为 null,则退出 false。

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

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

...

引用自POSIX 测试命令规范

Basically, you are asking test whether the string "-z" is nonempty. It is, so it tells you true. The actual algorithm test uses is:

  • 0 arguments:

    Exit false (1).

  • 1 argument:

    Exit true (0) if $1 is not null; otherwise, exit false.

  • 2 arguments:

    If $1 is '!', exit true if $2 is null, false if $2 is not null.

    If $1 is a unary primary, exit true if the unary test is true, false
    if the unary test is false.

    Otherwise, produce unspecified results.

...

Quoted from the POSIX test command specification.

浮萍、无处依 2024-12-18 19:27:27

据推测,如果没有参数,“-n”和“-z”不会被视为运算符,而只是被视为字符串,并且 test“a non-empty string” 为 true。我猜想 test 将其参数计数作为第一步,如果计数为 1,则只需检查参数的长度。

Presumably, without arguments "-n" and "-z" are not treated as operators but as mere strings, and test "a non-empty string" is true. I would guess that test counts its arguments as a first step, and if the count is 1, simply examine the length of the argument.

橘香 2024-12-18 19:27:27

是的,这是预期的。

$ 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 返回对所有选项均正确的退出状态。

尝试以下操作:

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

Yes it is expected.

$ 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 returns an exit status that is true for ALL options.

Try these:

test -d
test -f
test -n
test -G
test -k
...
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文