Условия: if, test и сравнения

Учим скрипт принимать решения в зависимости от условий.

Условие в Bash — это команда, чей код возврата (0 — успех, не 0 — неудача) определяет, какая ветка if выполнится.

if смотрит на код возврата

В большинстве языков if проверяет «истину» или «ложь». В Bash if запускает команду и смотрит на её код возврата: 0 означает успех (истину), любое другое число — неудачу.

if grep -q "error" log.txt; then
  echo "Ошибки найдены"
else
  echo "Чисто"
fi

Здесь grep -q возвращает 0, если нашёл совпадение. Никаких true/false — только код возврата команды. Блок закрывается словом fi (это if наоборот).

Команда test и квадратные скобки

Для сравнений используют команду test, у которой есть синоним — квадратные скобки [ ]. Пробелы внутри скобок обязательны!

a=5
b=10
if [ "$a" -lt "$b" ]; then
  echo "$a меньше $b"
fi

Вывод:

5 меньше 10

Для чисел используют буквенные операторы, для строк — символьные:

ЧислаСтрокиЗначение
-eq=равно
-ne!=не равно
-ltменьше
-gtбольше

Проверка файлов

Очень часто проверяют, существует ли файл или папка:

if [ -f config.yaml ]; then
  echo "Файл конфигурации есть"
fi
if [ -d /var/log ]; then
  echo "Папка логов на месте"
fi

-f — обычный файл существует, -d — это папка, -e — существует что угодно, -z — строка пуста, -n — строка не пуста.

Как работает под капотом

Скобка [ — это не синтаксис, а настоящая команда (файл /usr/bin/[ или встроенная), которой ] передаётся последним аргументом. Поэтому пробелы обязательны: [ и ] — отдельные слова. Команда вычисляет условие и возвращает код 0 или 1, а if просто смотрит на него. В современном Bash есть улучшенная форма [[ ]] — она безопаснее с пустыми переменными и поддерживает &&, || внутри.

Частые ошибки

  • Нет пробелов в скобках. [ "$a"-lt"$b" ] — ошибка; нужно [ "$a" -lt "$b" ].
  • Сравнивать числа через = или строки через -eq. Для чисел берите -eq/-lt/-gt, для строк =/!=.
  • Переменная без кавычек в скобках. Если $a пуста, [ $a -lt 5 ] сломается; кавычки "$a" спасают.

Итог

  • if в Bash проверяет код возврата команды: 0 — выполнить ветку, иначе — нет.
  • [ ] — это команда test; пробелы внутри обязательны.
  • Числа сравнивают -eq/-lt/-gt, строки — =/!=, файлы — -f/-d/-e.
Проверьте себя
1. На что смотрит if в Bash, чтобы выбрать ветку?
AНа значения true/false
BНа код возврата команды: 0 — успех
CНа наличие файла
DНа длину строки
2. Как правильно сравнить два числа a и b на «a меньше b»?
A[ $a < $b ]
B[ "$a" -lt "$b" ]
C[ $a lt $b ]
D[$a -lt $b]
3. Что проверяет условие [ -f config.yaml ]?
AЧто config.yaml — папка
BЧто config.yaml существует и является обычным файлом
CЧто строка config.yaml не пуста
DЧто файл исполняемый