Условия: 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.