Подтвердить что ты не робот

Как использовать шаблоны в выписке?

На странице man указано, что операторы case используют "соответствие шаблону расширения имени файла".
Я обычно хочу иметь короткие имена для некоторых параметров, поэтому я иду:

case $1 in
    req|reqs|requirements) TASK="Functional Requirements";;
    met|meet|meetings) TASK="Meetings with the client";;
esac

logTimeSpentIn "$TASK"

Я пробовал такие шаблоны, как req* или me{e,}t, которые, как я понимаю, будут правильно расширяться, чтобы соответствовать этим значениям в контексте расширения имени файла, но он не работает.

4b9b3361

Ответ 1

Расширение скобок не работает, но * ? и [] сделать. Если вы установили shopt -s extglob то вы также можете использовать расширенное сопоставление с образцом:

  • ?() - ноль или одно вхождение паттерна
  • *() - ноль или более вхождений паттерна
  • +() - одно или несколько вхождений паттерна
  • @() - одно вхождение шаблона
  • !() - все, кроме шаблона

Вот пример:

shopt -s extglob
for arg in apple be cd meet o mississippi
do
    # call functions based on arguments
    case "$arg" in
        a*             ) foo;;    # matches anything starting with "a"
        b?             ) bar;;    # matches any two-character string starting with "b"
        c[de]          ) baz;;    # matches "cd" or "ce"
        me?(e)t        ) qux;;    # matches "met" or "meet"
        @(a|e|i|o|u)   ) fuzz;;   # matches one vowel
        m+(iss)?(ippi) ) fizz;;   # matches "miss" or "mississippi" or others
        *              ) bazinga;; # catchall, matches anything not matched above
    esac
done

Ответ 2

Я не думаю, что вы можете использовать фигурные скобки.

Согласно руководству Bash о случае в условных конструкциях.

Каждый узор подвергается тильде расширение, расширение параметров, подстановка команд и арифметика расширения.

Ничего о Brace Expansion, к сожалению.

Итак, вам нужно сделать что-то вроде этого:

case $1 in
    req*)
        ...
        ;;
    met*|meet*)
        ...
        ;;
    *)
        # You should have a default one too.
esac

Ответ 3

if и grep -Eq

arg='abc'
if echo "$arg" | grep -Eq 'a.c|d.*'; then
  echo 'first'
elif echo "$arg" | grep -Eq 'a{2,3}'; then
  echo 'second'
fi

где:

  • -q препятствует тому, чтобы grep -q выходные данные, это только выдает статус выхода
  • -E включает расширенные регулярные выражения

Мне это нравится, потому что:

Недостатком является то, что это, вероятно, медленнее, чем case так как он вызывает внешнюю программу grep, но я склонен учитывать производительность в последнюю очередь при использовании Bash.

case POSIX 7

Похоже, Bash следует POSIX по умолчанию без shopt как указано fooobar.com/info/126416/...

Вот цитата: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_01 раздел "Условное построение случая":

Случай условной конструкции должен выполнить составной список, соответствующий первому из нескольких шаблонов (см. Нотацию соответствия шаблонов) [...] Несколько шаблонов с одним составным списком должны быть разделены знаком "|" условное обозначение. [...]

Формат для конструкции case выглядит следующим образом:

case word in
     [(] pattern1 ) compound-list ;;
     [[(] pattern[ | pattern] ... ) compound-list ;;] ...
     [[(] pattern[ | pattern] ... ) compound-list]
  esac

а затем http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_13 в разделе "2.13. Обозначение соответствия шаблону" только упоминается ? , * и [].