Как использовать конструкцию if в Bash: практический гайд для начинающих и продвинутых

Как эффективно применять условные конструкции `if` в скриптах Bash, раскрыть нюансы синтаксиса, типы сравнения, варианты вложенности и практические кейсы.

Как использовать конструкцию if в Bash: практический гайд для начинающих и продвинутых

Как эффективно применять условные конструкции if в скриптах Bash, нюансы синтаксиса, типы сравнения, варианты вложенности и практические кейсы.


1. Зачем нужен if в Bash?

В Bash if — это основа любой логики. С его помощью вы можете:

  • Проверять наличие файлов/директорий
  • Сравнивать числовые и строковые значения
  • Реагировать на код завершения программ
  • Управлять потоками выполнения скрипта (переключение веток)

Ниже – подробный разбор.


2. Базовый синтаксис

if CONDITION; then
    # команда(ы), выполняющиеся при истинности условия
else
    # команда(ы), выполняющиеся при ложности условия
fi

Что такое CONDITION?

  • Команда – её код возврата (0 — true, любой другой — false).
  • Выражение – результат команды test ([ ... ]) или [[ ... ]].
  • Группировка – несколько условий, объединенных &&/||.

3. Условия «внутри» if

Тип Оператор Пример Описание
Строка = / == [[ "$var" == "hello" ]] Равенство строк
!= [[ "$var" != "world" ]] Неравенство
< / > [[ "$var" < "m" ]] Лексикографический порядок (с [[ только)
Число -eq / -ne [ "$a" -eq 5 ] Равенство
-lt / -gt [ "$b" -gt 10 ] Меньше/больше
-le / -ge [ "$c" -le 20 ] ≤ / ≥
Файл -e [ -e "$file" ] Файл существует
-f [ -f "$file" ] Файл, а не директория
-d [ -d "$dir" ] Директория существует
-r, -w, -x [ -r "$file" ] Доступность (чтение/запись/исполнение)

Tip: [[ ... ]] более гибок, поддерживает паттерны (=~), не требует экранирования $ внутри скобок.


4. Сложные выражения

4.1. Логические операторы

if [[ $a -gt 10 && $b -lt 20 ]]; then
    echo "В диапазоне 10–20"
fi

&& и || работают как в C-подобных языках. Для test ([ ... ]) используйте -a и -o (но они менее читаемы).

4.2. Вложенные if

if [ -f "$file" ]; then
    if grep -q "error" "$file"; then
        echo "Файл содержит ошибки"
    fi
fi

Можно объединить в одну строку, но читаемость падает.

4.3. Короткое условие (if [[ … ]] && command)

[[ -f "$file" ]] && echo "Файл существует" || echo "Не найден"

Плюс: экономит строку. Минус: сложнее отлаживать.


5. if с case и while

Иногда удобно комбинировать:

while read -r line; do
    case "$line" in
        "foo")  echo "Found foo";;
        "bar")  echo "Found bar";;
        *)      echo "Other";;
    esac
done < "$input"

case предпочтительнее, когда нужно сравнивать одну переменную со множеством паттернов.


6. Практические примеры

6.1. Проверка аргументов

#!/usr/bin/env bash
set -euo pipefail

if [[ $# -ne 2 ]]; then
    echo "Usage: $0 <src> <dest>"
    exit 1
fi

src=$1; dest=$2
if [[ ! -f $src ]]; then
    echo "Source file not found!"
    exit 2
fi
cp "$src" "$dest"

6.2. Условный запуск команд

#!/usr/bin/env bash
set -euo pipefail

if ping -c 1 google.com &>/dev/null; then
    echo "Интернет доступен"
else
    echo "Нет доступа"
fi

6.3. Условный вывод зависимости от кода завершения

#!/usr/bin/env bash
set -euo pipefail

some_command
status=$?
if [[ $status -eq 0 ]]; then
    echo "Успешно завершено"
else
    echo "Ошибка ($status)"
fi

7. Частые ошибки и ловушки

Ошибка Почему Как исправить
if [ $var == "x" ]; then Не экранируется $ [ "$var" = "x" ]
if [[ $var < "x" ]]; then в [ ... ] < воспринимается как редирект Использовать [[
Неявное расширение *.txt Открывает все файлы, а не проверяет [[ -e *.txt ]] может давать неожиданные результаты
Ошибка line 3: syntax error near unexpected token Неправильные скобки Проверить двойные [ ] vs [[ ]] и fi

8. Советы по стилю

Совет Пример
Указывать set -euo pipefail в начале скрипта set -euo pipefail
Писать явные кавычки [[ "$var" == "value" ]]
Избегать else при однострочных командах [[ -f "$file" ]] && echo "OK"
Комментировать сложные условия # Проверяем, что файл не пуст и доступен для чтения

9. Полезные ресурсы

  • man bash – официальная справка по синтаксису.
  • info bash – более подробный описательный формат.
  • cheat.sh bash – быстрый справочник в терминале.
  • Книга "Linux Shell Scripting Cookbook" – практические рецепты.
  • Сайт tldp.org – статьи и руководства по Bash.

10. Итоги

  • Конструкция if в Bash – это не просто условие, а мощный инструмент для управления потоком.
  • Используйте [[ … ]] для более читаемого и безопасного синтаксиса.
  • Не забывайте об экранировании переменных и проверке наличия файлов.
  • Вложенные условия, логические операторы и комбинации if && command позволяют писать компактный и эффективный код.

Попробуйте применить эти принципы в ваших скриптах: вы увидите, как ваш Bash‑код станет более надёжным и легко поддерживаемым. 🚀