Bash case语法 - " - @"的含义

Lan*_*son 5 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
    
    Run Code Online (Sandbox Code Playgroud)

unw*_*ind 4

这里的“@(...)”是 Bash模式匹配语法的一部分。它是一个“或”,它只匹配列出的模式之一,并用管道字符分隔。

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

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

shopt -s extglob
Run Code Online (Sandbox Code Playgroud)

您可以检查是否已经启用它,如下所示:

shopt extglob
Run Code Online (Sandbox Code Playgroud)