提问人:Abdull 提问时间:7/25/2023 更新时间:7/25/2023 访问量:73
Bash 中的 'test ( foo )' / '[ ( foo )' 是什么?
What is `test ( foo )` / `[ ( foo )` in Bash?
问:
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,并且手册页提到了所讨论的语法。bash
5.1.4(1)-release
man bash
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
[
[[
评论
man bash
是一个巨大的文档,但它在某处解释了 和 的语法和参数。test
[
help test
Exit Status:
( foo )
127
foo
PATH
[ ... ]
test
[[ ]]
test
[ ]
[[ ]]
<
>
||
&&
test
test \( whatever \)
test
[
man test
[
[[
[[ ... ]]
[