Svn Bash case语法-表示“的”-@&引用;

Svn Bash case语法-表示“的”-@&引用;,svn,bash,Svn,Bash,我不熟悉下面bash脚本片段中“-@”的语义,它来自/etc/bash_completion.d/subversion。我试图理解为什么bash报告“意外标记附近的语法错误”(“在这一行中,我有两个问题: “@()”在这里应该做什么 为什么bash会对这一说法感到不满 case $prev in # other cases omitted -@(F|-file|-targets)) _filedir return 0;

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

  • “@()”在这里应该做什么
  • 为什么bash会对这一说法感到不满

    case $prev in
                    # other cases omitted
        -@(F|-file|-targets))
            _filedir
            return 0;
            ;;
                    # other cases omitted
            esac
    
  • 这里的“@(…)”是Bash语法的一部分。它是一个“or”,它只匹配列出的模式之一,由管道字符分隔

    最初的破折号只是从表达式中去掉;“-@(a | b | c)”与“@(-a |-b |-c)”相同,但更短

    正如一位评论者所指出的(谢谢!),这需要启用Bash的
    extglob
    ,才能工作。这是这样做的:

    shopt -s extglob
    
    您可以检查是否已按以下方式启用它:

    shopt extglob
    

    “@”是一种表示“匹配一个且仅匹配一个”的模式。您的代码示例中似乎有一个额外的结束符,这可能是打字错误或语法错误。

    这完全是猜测,因为我不熟悉所有bash语法,但我认为它应该更像:

    @(-F|-file|-targets))
    

    …如果这里的其他答案-@()与一个命令参数匹配,并且额外的
    是案例结构的一部分。我只是觉得破折号放错了地方。

    我找到了问题第二部分的答案,那就是为了启用“@(…)”,extglob“外壳选项需要打开。执行:

    shopt -s extglob
    

    在执行脚本之前,会消除错误。

    结束参数不是case语法的一部分吗?例如,请看这里:。我猜“-@(F|file|targets)”相当于“-F|--file|--targets”(其中“|”表示“或”),但我无法从文档中确认。请参阅本节底部提到的
    extglob
    。请参阅Lance Richardson对unwind答案的评论。