Операторы 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
».