if/elif/else/fi
Тема дорожной карты · Bash
Конструкция if ... then ... elif ... then ... else ... fi — основной механизм условного ветвления в Bash, вычисляющий команды или выражения [[ ]] и выполняющий соответствующий блок в зависимости от того, возвращают ли они код завершения 0 (истина) или ненулевое значение (ложь). Условия if в Bash проверяют широкий спектр условий: существование файла — if [[ -f "$path" ]], равенство строк — if [[ "$status" == "ok" ]], сравнение целых чисел — if (( count > 0 )) и успешность команды — if command; then — все эти шаблоны являются стандартными в скриптах автоматизации Linux. Ветка elif позволяет создавать несколько взаимоисключающих ветвей без глубокой вложенности, а объединение условий с && и || внутри [[ ]] делает Bash-скрипты читаемыми и лаконичными. Закрывающее ключевое слово fi — if, написанное наоборот — завершает условный блок; его пропуск является одной из наиболее распространённых синтаксических ошибок в написании shell-скриптов, которую немедленно обнаруживает bash -n. Понимание if/elif/else/fi — важнейший навык в Bash, применяемый практически в каждом скрипте автоматизации для ветвления логики на основе состояния системы, пользовательского ввода или результатов команд в командной строке Linux.
Как это работает
if/elif/else/fi: if cmd; then ...; elif cmd; then ...; else ...; fi — тестирует exit-код cmd. Bracket-форма [[ expr ]] (bash-специфична, безопаснее [ expr ]) тестирует строки, файлы, числа. Распространённые тесты: -f file, -d dir, -e exists, -z empty, -n non-empty, string == pattern (glob-match), string =~ regex. Числа: (( a > b )). case ... esac — для много-вариантной ветви.
Когда применять
[[ ]] лучше [ ] в bash — безопаснее (без word-splitting), поддерживает &&, ||, regex =~. (( )) — для арифметических сравнений. case — при 3+ ветвях, сравнивающих то же значение. Всегда закавычивайте строки в [[ ]] для переносимости ([[ "$x" == "y" ]]).
Типичные ошибки
Ловушки if/elif/else/fi: if [ $x == "y" ] с незакавыченным $x (если $x пустой, выражение становится [ == "y" ] — syntax error); [ ] где имели в виду [[ ]] (разные операторы, разные правила word-splitting); = vs == в [ ] (исторический случай — оба работают в bash, но = переносимее).