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
виробленню, він просто створює статус виходу
-E
дозволяє розширені регулярні вирази
Мені це подобається, тому що:
Один мінус полягає в тому, що це, швидше за все, повільніше, ніж case
з тих пір, як викликає зовнішню grep
програму, але я, як правило, вважаю продуктивність останньою, коли використовую Bash.
case
є POSIX 7
Здається, Bash дотримується POSIX за замовчуванням, shopt
як не згадується на https://stackoverflow.com/a/4555979/895245
Ось цитата: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_01 розділ "Умовна побудова справи":
У випадку умовної конструкції слід виконати складний список, що відповідає першому з кількох шаблонів (див. Позначення відповідності шаблонів) [...] Кілька шаблонів з одним і тим же складеним списком повинні бути обмежені знаком "|" символ. [...]
Формат конструкції випадку такий:
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. Позначення відповідності шаблону" лише згадує ?
, *
і []
.