Операторы if, then, else в Bash: примеры использования в Linux
Чтобы писать скрипты в Linux, нужно понимать, как работают условные операторы. Основная конструкция — If-then-else. С ее помощью можно проверять условия и управлять выполнением команд. Рассказываем, как это работает.

Базовый синтаксис: основа всех условных конструкций
Условные конструкции в Bash позволяют проверять условия в скриптах и определять, являются ли они истинными (True) или ложными (False). В Bash условие считается истинным, если команда или выражение возвращает код завершения 0, и ложным — если код отличен от нуля. Главный оператор, отвечающий за это — if. Он проверяет выражения и выбирает ветку выполнения команды.
Структура оператора if-then-else
Оператор if-then-else в Bash — конструкция, которая после проверки условий позволяет выполнять команды. Базовый шаблон может выглядеть так:

Расшифровываем:
if — ключевое слово в начале условного оператора. После него стоит условие, которое должно проверяться.
[[ условие ]] — то, что будет проверяться. Условия записываются в двойных квадратных скобках, поскольку такой синтаксис позволяет обойтись без экранирований и поддерживает разные логические операторы при работе со строками и числами.
then — начало блока команд, которые будут выполняться при истинном условии.
else — блок команд, которые выполняются при ложных условиях.
fi — завершение логической конструкции. Это слово if, записанное наоборот.
Сначала проверяются условия, которые указаны в if. Если оператор возвращает True, выполняются команды блока then. Если False, то команды else (если он есть).
Условные операторы — основа автоматизации серверных задач. Отработать навыки написания скриптов можно на виртуальных машинах Evolution Compute от Cloud.ru: гибкие конфигурации, управление через API и безопасное подключение по SSH позволяют быстро развернуть среду для тестирования и эксплуатации.
Скрипт с операторами if и else
Запуск скриптаПроверка кода возврата предыдущей команды
Оператор if может проверять результат выполнения команды. Любая выполненная команда в Linux возвращает exit code — код возврата. Варианты:
0 — команда выполнена успешно;
любое значение, кроме 0 — условие не выполнено или в процессе произошла ошибка.
Процесс выглядит так — выполняется команда, Bash анализирует код возврата. Если выходит код 0, условие считается истинным, значит, выполняется then. Если получилось ненулевое значение, управление передается в блок else.
Для примера — проверка результата команды grep:
В файле file.txt grep ищет слово «текст». Если оно есть, возвращается код 0 и выполняется then. Если слова нет, выходит ненулевой код, после чего выполняется else.
Типы условий и операторы сравнения
В Bash оператор if поддерживает разные типы условий и специальные операторы сравнения. Рассказываем, что и как может сравниваться.
Сравнение строк
Если нужно проверить значения переменных, аргументы команды или пользовательский ввод, Bash посимвольно сравнивает строки. Какие операторы используются:
= — строки равны;
!= — строки разные;
-z — строка пустая;
-n — строка не пустая.
Пример, когда строка не пустая:
Условие считается выполненным, если в переменной name есть строка admin.
Пример, когда строка пустая:
Сравнение чисел
Для сравнения чисел в конструкции [[ ]] применяются специальные арифметические операторы, которые отличаются от строковых. Например, знак = в [[ ]] приводит к строковому сравнению, что может вызвать логические ошибки. При этом в арифметическом контексте (( )) можно использовать привычные операторы ==, !=, >, < для сравнения чисел. Какие операторы применяются:
-eq — равно;
-ne — не равно;
-gt — больше;
-lt — меньше;
-ge — больше или равно;
-le — меньше или равно.
Пример сравнения чисел:
Если переменная count содержит число больше 10, условие считается выполненным.

Проверка файлов и директорий
В Bash есть тесты для проверки файловой системы. С их помощью можно определить, существует ли файл, какие действия с ним можно выполнять и является ли он директорией. Операторы:
-f — есть, обычный файлом;
-d — есть, является директорией;
-e — файл или директория существует;
-r — доступен для чтения;
-w — доступен для записи.
Пример проверки:
Пример проверки директории и прав доступа:
Расширенные условные конструкции
В Bash-скриптах условия обычно бывают сложными. В таких случаях можно объединять проверки. Вот примеры расширенных конструкций и логических операторов.
Цепочка условий: оператор elif
Оператор полезен, когда нужно подряд проверить несколько взаимоисключающих условий. Проверки будут выполняться сверху вниз, пока не обнаружится первый истинный вариант. Пример:
Вложенные условия
Такие условные конструкции используются, если одно условие логически зависит от другого. Такое часто бывает при работе с файлами и правами доступа. Пример:
Логические операторы в условиях (&&, ||)
Такие операторы позволяют объединять несколько проверок. Оператор И (&&) означает, что все условия должны быть истинными. Пример:
Оператор ИЛИ (||) означает, что достаточно одного истинного условия. Пример:
Альтернативные формы записи условий
В Bash для проверки условий существуют не только конструкции if … then … fi. Показываем компактные варианты, которые часто используются в коротких скриптах.
Сокращенный синтаксис с && и ||
Это форма выполнения команды, которая основана на коде возврата предыдущей команды. Подходит для простой логики. При использовании цепочек с && и || помните, что они выполняются слева направо с одинаковым приоритетом. Для группировки условий используйте { } или ( ). Варианты:
команда && действие_при_успехе — вторая команда выполнится только в том случае, если первая выдаст нулевой код возврата.
команда || действие_при_ошибке — второе выражение выполнится, если предыдущая команда завершится с кодом возврата, не равным нулю.
Пример:
Переход в каталог возможен, если этот каталог был ранее успешно создан.
Альтернативный синтаксис [ ] вместо [[ ]]
Помимо двух квадратных скобок могут быть и одинарные — [ ]. Это команда test, которая считается более старым способом проверки условий.
Пример применения:
Внутри конструкции не поддерживаются логические операторы && и ||. К тому же, необходимо следить за правильным размещением переменных и пробелов.
Команда test для переносимости
Команда test и ее синоним [ ] — это инструмент проверки условий, доступный во всех POSIX-совместимых системах (включая устаревшие Unix-подобные ОС). Она медленнее, чем [[ ]], и требует внимательного обращения с пробелами, но необходима для переносимости на sh или dash.
Пример:
Команда применяется в переносимых shell-скриптах вроде sh и dash, минимальных окружениях и ситуациях, где нельзя применить [[ ]].
Практические примеры из реальной жизни
Условные конструкции в Bash применяются для решения прикладных задач, например, при проверке входных данных, администрировании, работе с файлами. Разберем типовые сценарии.
Проверка наличия аргументов скрипта
Например, нужно проверить, были ли при запуске скрипта переданы аргументы. Шаблон:
Переменная $# содержит количество аргументов командной строки. Если аргументов нет, скрипт выведет подсказку, и команда завершится с кодом ошибки 1. Это позволит предотвратить запуск с пустыми значениями.
Валидация ввода пользователя
Нужно проверять допустимость и корректность данных пользовательского ввода еще до использования. Пример проверки указанного пути:
Здесь:
-z проверяет, что в строке есть данные, -e — что указанный путь существует.
Обработка ошибок при работе с файлами
Перед чтением, копированием и удалением файлов нужно проверять, существуют ли эти файлы и какие для них есть права доступа. Пример проверки перед удалением:
С помощью проверки можно предотвратить случайное удаление и ошибки из-за отсутствия прав.
Автоматизация системных задач
В администрировании операторы в Bash позволяют мониторить состояние системы и принимать решения без человеческого участия. Пример проверки наличия свободного места на диске:
Также можно проверять запуск службы systemctl is-active, контролировать наличие обновлений, перезапускать сервисы при ошибках и многое другое.
Распространенные ошибки и лучшие практики
При использовании условных конструкций в Bash соблюдайте базовые правила, чтобы повысить надежность скриптов и сделать код предсказуемым.
Обязательные кавычки для переменных
Заключайте переменные в Bash в кавычки, чтобы избежать лишних пробелов и пустых значений. Пример ошибки:
Если переменная name содержит пробелы или пуста, условие отработает некорректно.
Как записать верно:
Правильные отступы для читаемости
Даже правильный код будет сложно читаться без отступов. Благодаря отступам можно быстрее найти ошибки и сделать условия наглядными. Пример правильного форматирования:
Использование (( )) для арифметических операций
При работе с числами в Bash вместо [[ ]] используйте (( )). Такой формат поддерживает инкременты и декременты, не требует ввода дополнительных символов, упрощает чтение кода. Пример записи:
Избегание избыточных проверок
Не дублируйте условия, которые уже подразумеваются по логике выполнения. Это усложнит код. Пример ошибки:
Правильный вариант:
Отладка условных конструкций
Чтобы обнаруживать и исправлять ошибки в if-конструкциях в Bash, используйте встроенные средства отладки. Рассказываем, какие точно пригодятся.
Ключ -x для отладки скриптов
При сложных условиях и вложенных конструкциях используйте режим трассировки. Он позволит увидеть, какие команды и в каком порядке выполняются. Пример:
-x выводит каждую команду в терминал перед выполнением, отображает значения. Можно запустить трассировку и прямо в коде без -x:
Добавление отладочного вывода
Перед сложными условиями старайтесь выводить значения переменных и добавлять префикс Debug. Это особенно актуально при работе с аргументами команд и пользовательским вводом. Пример отладочного вывода:
Проверка синтаксиса без выполнения
Если с выполнением скрипта возникли проблемы, проверьте синтаксис:
Режим -n находит ошибки и проверяет правильность конструкции if / then / else / fi.
Заключение
При написании Bash-скриптов выбирайте логического оператора в зависимости от задачи. Если проверяются два-три условия, подойдет if-elif-else. Для большего количества проверок удобнее применять case. Если нужно выполнить простые действия после удачного или неудачного завершения команды, используйте сокращенные конструкции с && или ||.
Шпаргалка по операторам проверки:
Тип условия | Оператор | Пример | Описание |
Сравнение строк | = | [[ "$name" = "admin" ]] | Проверка, равны ли строки |
!= | [[ "$name" != "guest" ]] | Проверка, что строки не равны | |
-z | [[ -z "$var" ]] | Истинно, если строка пустая | |
-n | [[ -n "$var" ]] | Истинно, если строка не пустая | |
Сравнение чисел | -eq | [[ $count -eq 10 ]] | Равно |
-ne | [[ $count -ne 0 ]] | Не равно | |
-gt | [[ $count -gt 10 ]] | Больше | |
-lt | [[ $count -lt 5 ]] | Меньше | |
-ge | [[ $count -ge 10 ]] | Больше или равно | |
-le | [[ $count -le 20 ]] | Меньше или равно | |
Проверка файлов и директорий | -f | [[ -f "/path/to/file" ]] | Проверка, что файл существует |
-d | [[ -d "/path/to/dir" ]] | Проверка, что директория существует | |
-e | [[ -e "/path/to/item" ]] | Проверка существования файла или директории | |
-r | [[ -r "/path/to/file" ]] | Проверка, что файл доступен для чтения | |
-w | [[ -w "/path/to/file" ]] | Проверка, что файл доступен для записи | |
Логические операторы | && | [[ -f "$file" && -r "$file" ]] | Истинно, если оба условия верны |
