我不熟悉下面bash脚本片段中“ - @”的语义,它来自/etc/bash_completion.d/subversion。我试图理解为什么bash报告“意外令牌附近的语法错误”(在这一行上,我有两个问题:
为什么bash会对这句话感到不满?
case $prev in
# other cases omitted
-@(F|-file|-targets))
_filedir
return 0;
;;
# other cases omitted
esac
答案 0 :(得分:4)
这里的'@(...)'是Bash的pattern matching语法的一部分。它是一个“或”,它只是匹配列出的模式之一,用管道符号分隔。
最初的破折号只是从表达式中分解出来的; “ - @(a | b | c)”与“@( - a | -b | -c)”相同,但更短。
正如评论者指出的那样(谢谢!)这需要Bash的extglob
能够正常工作。这样做是这样的:
shopt -s extglob
您可以检查是否已启用此功能:
shopt extglob
答案 1 :(得分:1)
我找到了问题第二部分的答案,即为了启用“@(...)”,需要启用“extglob”shell选项。执行:
shopt -s extglob
在执行脚本之前消除了错误。
答案 2 :(得分:0)
“@”是一种模式,意思是“只匹配一个”。而且你的代码示例中似乎有一个额外的结束语,这可能是拼写错误或语法错误。
答案 3 :(得分:0)
这完全是猜测,因为我不熟悉所有的bash语法,但我认为它应该更像:
@(-F|-file|-targets))
...考虑到其他答案,这是有道理的 - @()匹配其中一个命令参数,而额外的)
是案例结构的一部分。我只是觉得破折号在错误的地方。