Bash 中的 'test ( foo )' / '[ ( foo )' 是什么?

What is `test ( foo )` / `[ ( foo )` in Bash?

提问人:Abdull 提问时间:7/25/2023 更新时间:7/25/2023 访问量:73

问:

Bash 参考手册提到了以下关于 test / [ 命令的内容:

1 参数

当且仅当参数不为 null 时,表达式才为 true。

目前为止,一切都好:

$ test "foo"
$ echo $?
0

$ test foo
$ echo $?
0

$ test ""
$ echo $?
1

$ SET_VARIABLE="hello"
$ test $SET_VARIABLE
$ echo $?
0

$ unset UNSET_VARIABLE
$ test $UNSET_VARIABLE
$ echo $?
1

$ NULL_VARIABLE=
$ test $NULL_VARIABLE
$ echo $?
1

但是,手册提到了以下三个论点:

3 参数

...

如果第一个参数正好是 '(',第三个参数正好是 ')',则结果是第二个参数的单参数检验。

对于这个三论点的案例,我找不到任何工作的例子;任何尝试都会导致语法错误:

$ test ( "foo" )
bash: syntax error near unexpected token `"foo"'
$ echo $?
2

$ test ( foo )
bash: syntax error near unexpected token `foo'
$ echo $?
2

$ test ( "" )
bash: syntax error near unexpected token `""'
$ echo $?
2

对于相应的 4 参数情况,也会发生相同的语法错误:失败并出现语法错误,而 2 参数表达式工作正常。test ( -d /boot )test -d /boot

我的版本是 ,并在末尾声明 GNU Bash 5.1,并且手册页提到了所讨论的语法。bash5.1.4(1)-releaseman bash

test 的参数语法有哪些工作示例,该语法可以用于什么?

bash 语法错误

评论

0赞 axiac 7/25/2023
man bash是一个巨大的文档,但它在某处解释了 和 的语法和参数。test[
0赞 Jetchisel 7/25/2023
请参阅,在底部显示 Also running alone 的计算结果为 false,退出状态为 except 或 course,如果您在help testExit Status:( foo )127fooPATH
0赞 David C. Rankin 7/25/2023
Man Bash 还解释说,它只是 On shell 的别名,它是内置的。例如,我应该在 POSIX shell 中使用“test”还是“[” “]”?POSIX测试[ ... ]test
0赞 Gordon Davisson 7/25/2023
括号是 shell 语法中的特殊字符;您必须引用或转义它们才能在参数中传递它们。这是条件表达式相对于 / 的优点之一——表达式不是命令,也不受正常命令解析的约束,因此它使用括号、与 and 的比较、与 and 的连词等,而不需要引用或转义它们(与 不同的是,它的语法是明确的,因此对于任何复杂的东西都更安全)。[[ ]]test[ ][[ ]]<>||&&test
0赞 user1934428 7/25/2023
括号对 bash 有特殊的含义。你必须逃避他们:.顺便说一句,内部 bash 命令只是同名外部命令的内部重新实现(具有微小的扩展,与测试相等性有关),我建议用它来学习这些命令。与 不同的是,它不是命令,而是 bash 中的合成结构,并且内部应用了不同的引用规则,我建议您在 bash 中使用该结构,而不是依赖命令。test \( whatever \) test[man test[[[[[ ... ]][

答:

3赞 Paolo 7/25/2023 #1

如果第一个参数正好是 '(',第三个参数正好是 ')',则结果是第二个参数的单参数检验。

$ test "(" "foo" ")"
$ echo $?
0

$ test "(" "" ")"
$ echo $?
1

因此,实际上退出代码与仅使用第二个参数作为参数时产生的退出代码相匹配。

$ test "foo"
$ echo $?
0

$ test ""
$ echo $?
1

评论

0赞 Abdull 7/26/2023
谢谢。在哪些情况下添加这些括号是有意义的?我无法确定任何它们澄清、消除歧义或影响优先级的例子。test
1赞 Paolo 7/26/2023
@Abdull我不明白为什么有人会想这样做。你是想解决一个特定的问题,还是只是一种好奇心?
0赞 Abdull 7/27/2023
出于好奇,考虑到括号给文档带来的冗长和复杂性,但实际上归结为一个毫无意义的功能,我最初认为我错过了一个我想了解更多的漂亮技巧。test
0赞 Paolo 7/27/2023
@Abdull,如果有一个用例,它肯定没有被正确记录下来!
5赞 Inian 7/25/2023 #2

您对 的三个参数用法是正确的,但是 是 bash 中的保留字,表示在子 shell 上下文中运行内部提供的命令。在尝试与一起使用时,您需要剥夺其特殊含义test()test

$ touch foo
$ test \( -f foo \)
$ echo $?
0

如果您使用的是 bash 并且不担心可移植性,则首选传统的内置版本。更多关于两者区别的见解写得很好,请见 BashFAQ/031 - test、\[ 和 \[\[ 和有什么不一样?[[[

评论

0赞 Abdull 7/26/2023
谢谢。在哪些情况下添加这些括号是有意义的?我无法确定任何它们澄清、消除歧义或影响优先级的例子。test
0赞 Inian 7/26/2023
老实说,我根本不会使用,语法很糟糕,过时且过时。我会使用更干净的语法,如果可移植性不是问题,肯定是 bash 的 .test[[[