Как использовать шаблоны в выписке?
На странице 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
, которые, как я понимаю, будут правильно расширяться, чтобы соответствовать этим значениям в контексте расширения имени файла, но он не работает.
Ответы
Ответ 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. Обозначение соответствия шаблону" только упоминается ?
, *
и []
.