case - оператор для множественного ветвления, заменяющий цепочки операторов if/then/else
Пример
Круглые скобки в case
Для каждой закрывающей скобки в синтаксисе case есть возможность поставить открывающую круглую скобку: (“yes”) вместо “yes”) в примере выше.
Ставить открывающую скобку необязательно + зачем лишний символ?
Мощь case в поддержке сопоставления с шаблонами (это также и идиоматический подход):
В примере выше использовал подстановочные знаки командной строки, которые обычно используются при передаче filenames. Есть три подстановочных знака:
Знак | Explain |
---|---|
? | любой символ |
* | любые символы |
[ ] | любой из символов внутри них |
Из примера выше:
Конструкция [Nn][Oo]*
соответствует, например: no, nO, NO, noway, Not Ever
.
Вертикальная черта ( | ) - это, по сути, логическое “ИЛИ”, то есть, шаблону [Yy]?? | [Ss]ure | [Oo][Kk]*
будут соответствовать: Yes, yes, YES, yEs, yES, yup, Sure, sure, OK, ok, OKfine, OK why not
.
* )
- это вариант по умолчанию, то есть, шаблон, совпадающий с чем угодно. Если ни с одним из предыдущих шаблонов совпадений не было найдено - с этим найдется всегда. Поэтому его и помещают последним в списке.
Короче, если нужны RegEx-ы - используй if/then/else
конструкцию, а не case
.
Про символы ;;
Символы
;;
означают, что ничего дальше не нужно делать, то есть, bash, встретив эти символы, закончит всю логику внутри case перейдет к следующей инструкции после esac. Bash после этих символов завершает выполнение оператора case.
Но если нужно, чтобы bash проверял и другие варианты в case (или выполнял другие действия) → можно использовать комбинации символов ;;&
и ;&
. Наглядно:
Шаблоны в примере будут сравниваться по порядку со значением $filename
.
;&
говорит спуститься дальше и выполнить все команды, перечисленные в следующем варианте без проверки совпадения с шаблоном этого варианта.
То есть, в случае выше, если даже будет введен 1 → выведется и 2.
А ;;&
говорит проверить другие варианты по порядку.
Т.к. применение этих символов не особо понятно не знакомым с bash людям - лучше тщательно комментировать код (или юзать if/else/elif
).
Соус: Книга Идиомы Bash → Глава 3. На всякий случай: оператор Case