Bash case语法 - “ - @”的含义

时间:2009-07-14 12:54:49

标签: svn bash

我不熟悉下面bash脚本片段中“ - @”的语义,它来自/etc/bash_completion.d/subversion。我试图理解为什么bash报告“意外令牌附近的语法错误”(在这一行上,我有两个问题:

  1. 什么是“ - @()”应该在这里做什么?
  2. 为什么bash会对这句话感到不满?

    case $prev in
                    # other cases omitted
        -@(F|-file|-targets))
            _filedir
            return 0;
            ;;
                    # other cases omitted
            esac
    

4 个答案:

答案 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))

...考虑到其他答案,这是有道理的 - @()匹配其中一个命令参数,而额外的)是案例结构的一部分。我只是觉得破折号在错误的地方。