Ветвление в Bash (case, if)
Содержание
Теоретическая часть
If-предложения в Bash очень похожи на аналогичные в других языках. Они следуют базовой форме:
Если переводить команды на простой язык, то можно сказать так: Если (if) что-то является истиной, тогда (then) выполни вот это. В противном случае проверяй другие условия по порядку и делай то же самое. Если ни одно из условий не сработало, выполни последнее указание.
Булевы операторы ! (нет), && (и), || (или) могут использоваться для комбинирования выражений, как и в других языках. Операторы ; , &&, || используются для выполнения команд в определенной последовательности. Оператор ; выполняет следующую команду независимо от результата предыдущей, && выполняет следующую команду только после успешного выполнения предыдущей (логическое и), а || выполняется только после неудачного выполнения предыдущей команды (логическое или).
Еще один пример скрипта:
# Однострочная запись
if [ ... ]; then echo "true"; else echo "false"; fi;
## Вложенные условия
if [ ... ] && [ ... ]; then
...
elif [[ ... && ... ]]; then
...
else
...
fi;
А теперь разберемся с самым сложным моментом в данной теме... скобки!!! Порой вам встретятся двойные квадратные скобки, как в примере выше. А порой они будут одинарными. В чем подвох?)
Иногда скобки могут быть круглыми
Давайте разберемся, что здесь происходит. Вот шаблон того, что происходит на самом деле:
Все верно: содержимое сразу после if может быть вообще любой командой, если она дает код выхода (а практически всегда так и бывает). Если команда возвращает код выхода 0 (в Bash это код успешно выполненной операции), тогда запускается код внутри ветки then. В противном случае Bash переходит к следующей ветке и делает новую попытку.
Но, погодите, это означает, что…
Ага. «[» это команда. Это, собственно, синтаксический сахар для встроенной команды test, которая проверяет и сравнивает переданные ей аргументы. «]» это на самом деле аргумент для команды [, который говорит ей прекратить проверять аргументы!
Что касается двойных скобок, то [[ двойные квадратные скобки ]] и ((двойные круглые скобки)) это не совсем команды. Они представляют собой ключевые слова языка Bash, в результате чего они ведут себя немного более предсказуемо. Тем не менее, в зависимости от своего содержимого, они по-прежнему возвращают код выхода.
[[ Двойные квадратные скобки ]] работают в целом так же, как и [одинарные квадратные скобки], но имеют дополнительные возможности вроде лучшей поддержки регулярных выражений.
(( Двойные круглые скобки )) это конструкция, позволяющая осуществлять арифметические вычисления внутри Bash. Вам даже не нужно использовать их с if-предложением.
Далее приведем таблицу с возможными условиями сравнения:
Если необходимо сделать выбор из нескольких альтернатив, пригодится оператор case. Принцип его работы легче понять на примере:
В примере оператор проверяет значение переменной $extension на совпадение с одним из шаблонов и в случае совпадения выполнит соответствующий блок кода. Если же совпадений не будет, выполнятся указания, соответствующие шаблону *.
Также можно создавать сложные условные конструкции, используя вложенные условия. Например:
Или можно написать аналогичный скрипт, используя только if:
Практическая часть
Задачи
Наибольшее число
Напишите скрипт, который будет принимать на вход три числа и печатать наибольшее из них
Предсказывание будущего
Вам подарили на день рождения волшебный цветок, который будет расти только при опредленных условиях. Условия таковы: плотность почвы должна быть больше 10, цвет горшка красным и в доме должно быть больше трех животных. Вам на вход подаются данные: плотность почвы, цвет горшка и количество живоотных. Предскажите, погибнет ли цветок?
Египетский треугольник
Напишите скрипт, который считывае длины двух катетов, затем длину гипотенузы и проверяет является ли данный треугольник египетским.
Проверим, что вы запомнили:)
- Для чего используется каждый из этих операторов: ; , &&, ||?
- Расскажите, в каких случаях испольуется каждый из видов скобок?
- В каких случаях мы используем опреатор "case"?
- Опишите примерную схему работы опраторов if, elif, else