Ветвление в 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, цвет горшка красным и в доме должно быть больше трех животных. Вам на вход подаются данные: плотность почвы, цвет горшка и количество живоотных. Предскажите, погибнет ли цветок?

Египетский треугольник

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

Проверим, что вы запомнили:)

  1. Для чего используется каждый из этих операторов: ; , &&, ||?
  2. Расскажите, в каких случаях испольуется каждый из видов скобок?
  3. В каких случаях мы используем опреатор "case"?
  4. Опишите примерную схему работы опраторов if, elif, else