Синтаксис Bash - значение "- @" - PullRequest
5 голосов
/ 14 июля 2009

Я не знаком с семантикой "- @" в приведенном ниже фрагменте скрипта bash, который находится в /etc/bash_completion.d/subversion. Я пытаюсь понять, почему bash сообщает "синтаксическая ошибка рядом с неожиданным токеном" (в этой строке у меня два вопроса:

  1. Что ожидается от "- @ ()" здесь?
  2. Почему Баш может быть недоволен этим утверждением?

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

Ответы [ 4 ]

4 голосов
/ 14 июля 2009

'@ (...)' здесь является частью синтаксиса Bash , соответствующего шаблону . Это «или», оно просто соответствует одному из перечисленных шаблонов, разделенных символами канала.

Начальная черта просто была выведена из выражения; «- @ (a | b | c)» совпадает с «@ (- a | -b | -c)», но короче.

Как указал комментатор (спасибо!), Для работы Bash extglob необходимо. Это делается так:

shopt -s extglob

Вы можете проверить, включено ли оно, вот так:

shopt extglob
1 голос
/ 14 июля 2009

Я нашел ответ на вторую часть моего вопроса, которая заключается в том, что для включения «@ (...)» должна быть включена опция оболочки extglob. Выполнение:

shopt -s extglob

перед выполнением скрипта устраняет ошибку.

0 голосов
/ 14 июля 2009

Это полностью предположение, поскольку я не знаком со всем синтаксисом bash, но я думаю, что это должно быть больше похоже на:

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

... что имеет смысл, учитывая другие ответы здесь - @ () соответствует одному из аргументов команды, а дополнительный ) является частью структуры case. Я просто думаю, что черта не в том месте.

0 голосов
/ 14 июля 2009

«@» - это шаблон, который означает «соответствовать одному и только одному». И у вас, кажется, есть дополнительный закрывающий знак в вашем примере кода, который является либо опечаткой, либо вашей синтаксической ошибкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...