Операторы if-then-else и case
Практически любая программа требует выполнения различных наборов команд в зависимости от условий. В bash для этого есть операторы if-then-else и case.
Оператор if-then-else
Оператор if-then-else проверяет — является ли код возврата команды нулевым (поскольку 0 означает ИСТИНА), и если это так, то выполняет команды, следующие за словом then. Если код возврата ненулевой (ЛОЖЬ), то выполняются команды, следующие за словом else.
if команда; then команда команда ....... else команда команда ....... fi
Существует специальная команда — […] (синонимом команды test). Она воспринимает свои аргументы как выражение сравнения или как файловую проверку и возвращает код завершения в соответствии с результатами проверки (0 — истина, 1 — ложь).
В новых версиях bash добавлена конструкция [[…]] (расширенный вариант команды test), которая выполняет сравнение способом, более привычном для программистов. Оболочка исполняет [[…]] как один элемент, который имеет код возврата.
Круглые скобки ((…)) возвращают код 0, если результатом арифметического выражения является ненулевое значение. Таким образом, арифметические выражения могут участвовать в операциях сравнения.
if [ "$(whoami)" != 'root' ] ; then echo "У вас нет прав для запуска $0." exit 1; fi
for file in /home/evgeniy/* ; do if [ -d "$file" ] ; then echo "$file — это директория" elif [ -f "$file" ] ; then echo "$file — обычный файл" else echo "$file — что-то еще" fi done
Оператор case
Оператор case позволяет выполнять тот или иной участок кода, в зависимости от результатов проверки условий. Она является, своего рода, краткой формой записи большого количества операторов if/then/else. Синтаксис крайне простой: нужно указать переменную, шаблоны и блоки кода после каждого шаблона.
#!/bin/bash # считывание ввода пользователя echo -n 'Введите имя файла: ' read file # проверяем совпадение переменной file с шаблоном case $file in *.php) echo 'Программа на языке PHP' ;; *.js ) echo 'Исходный код JavaScript' ;; *.css) echo 'Каскадная таблица стилей' ;; *) echo 'Тип файла не распознан' ;; esac
Оператору case можно передать всего один параметр, который поочередно сравнивается с подготовленными шаблонами. Если сравнение истинно, выполняется блок кода, следующий за шаблоном. Выполнение case завершится при отработке блока кода, либо прохождении всех шаблонов до конца и отсутствии совпадений.
Если требуется назначить несколько шаблонов для одного и того же блока команд, используйте символ «|» для их разделения. Например, «*.txt|*.shell».