Home » if-else в shell-скриптах — Условная логика в Bash
if-else в shell-скриптах — Условная логика в Bash

if-else в shell-скриптах — Условная логика в Bash

В этой статье разбираемся с if-else в shell-скриптах — базовой, но критически важной конструкцией для автоматизации и управления сервером. Если ты когда-нибудь задавался вопросом, как сделать скрипт умнее, чтобы он реагировал на разные ситуации (например, если сервис не запущен — запусти, если диск переполнен — отправь алерт), то ты по адресу. Здесь не будет занудных теорий — только практика, реальные кейсы, грабли и лайфхаки, которые помогут быстро освоить условную логику в Bash и сразу внедрить это в свои скрипты. Погнали!

Как работает if-else в Bash: простое объяснение

В мире Bash всё крутится вокруг команд и их кода возврата (exit status). Если команда завершилась успешно (код 0), условие считается истинным. Если что-то пошло не так (код не 0) — ложь. На этом строится вся магия if-else. Вот базовый синтаксис:


if команда; then
# действия, если команда успешна
else
# действия, если команда неуспешна
fi

Можно использовать и более сложные условия с elif (else if), а также логические операторы (&&, ||, [[ ]] и [ ]).

Как быстро и просто всё настроить: пошагово

  1. Открой редактор — nano, vim, mcedit, что угодно.
  2. Создай файл с расширением .sh (например, check_service.sh).
  3. Добавь shebang в начало: #!/bin/bash
  4. Пиши логику с if-else — смотри примеры ниже.
  5. Сохрани и сделай исполняемым: chmod +x check_service.sh
  6. Запусти: ./check_service.sh

Примеры, схемы, практические советы

Давай разберёмся на реальных задачах, которые встречаются при администрировании серверов.

Кейс Пример кода Что делает Рекомендация
Проверка, запущен ли сервис
if systemctl is-active --quiet nginx; then
echo "Nginx работает"
else
echo "Nginx не запущен, стартуем..."
systemctl start nginx
fi
Если nginx не работает — запускает его Используй для автозапуска критичных сервисов
Проверка свободного места на диске
if [ $(df / | awk 'NR==2 {print $5}' | sed 's/%//') -gt 90 ]; then
echo "Диск почти заполнен!"
else
echo "Всё ок"
fi
Алерт при заполнении диска >90% Встраивай в мониторинг, чтобы не словить out of space
Проверка наличия файла
if [ -f /etc/passwd ]; then
echo "Файл есть"
else
echo "Файл отсутствует"
fi
Проверяет существование файла Полезно для резервных копий, логов и конфигов
Проверка переменной окружения
if [ -z "$API_KEY" ]; then
echo "API_KEY не задан!"
exit 1
fi
Проверяет, что переменная не пуста Обязательный чек для скриптов с секретами

Положительные и отрицательные кейсы: что делать, а что — нет

Что делать Что не делать
  • Использовать [[ ]] для сложных условий (поддерживает regex, &&, ||)
  • Писать читаемые скрипты с отступами и комментариями
  • Проверять exit status явно: if some_command; then ...
  • Обрабатывать все ветки условий (else/elif)
  • Не использовать if [ $var = "foo" ] без кавычек — словишь баги на пустых переменных
  • Не забывать про fi — иначе скрипт не сработает
  • Не писать всё в одну строку — сложно дебажить
  • Не игнорировать exit codes — иначе скрипт будет “слепым”

Команды и конструкции: полный список для if-else в Bash


# Базовый синтаксис
if команда; then
# действия
elif другая_команда; then
# другие действия
else
# альтернативные действия
fi

# Проверка условия с [ ]
if [ "$var" = "foo" ]; then
# ...
fi

# Проверка условия с [[ ]]
if [[ "$var" =~ ^[0-9]+$ ]]; then
# ...
fi

# Логические операторы
if [[ "$a" -gt 5 && "$b" -lt 10 ]]; then
# ...
fi

# Проверка существования файла/директории
if [ -f file.txt ]; then
# файл существует
fi
if [ -d /etc ]; then
# директория существует
fi

# Проверка переменной на пустоту
if [ -z "$var" ]; then
# переменная пуста
fi
if [ -n "$var" ]; then
# переменная не пуста
fi

# Инверсия условия
if ! команда; then
# если команда завершилась с ошибкой
fi

Похожие решения, программы и утилиты

  • test — встроенная команда для проверки условий ([ ... ] это алиас для test).
  • case — альтернатива if-else для множественных ветвлений (см. официальную документацию Bash).
  • expr — для арифметики и сравнения чисел (устарело, но встречается).
  • set -e — завершает скрипт при ошибке любой команды (но не всегда удобно для сложных сценариев).

Статистика и сравнение с другими языками/решениями

  • Bash — самый популярный shell для автоматизации на Linux (по данным Stack Overflow и GitHub).
  • if-else в Bash проще и короче, чем в Python или Perl, но менее выразителен для сложных условий.
  • В отличие от Ansible или SaltStack, Bash-скрипты не требуют установки дополнительных пакетов — всё работает из коробки.
  • Для сложных сценариев (например, с множеством вложенных условий) лучше использовать case или даже перейти на Python.

Интересные факты и нестандартные способы использования

  • Можно использовать if-else прямо в командной строке, без скрипта:

    if ping -c1 ya.ru >/dev/null; then echo "Интернет есть"; else echo "Нет интернета"; fi
  • В Bash можно писать однострочные условия:

    [ -f /etc/passwd ] && echo "Файл есть" || echo "Файла нет"
  • Можно комбинировать условия с помощью [[ ]] и регулярных выражений — удобно для парсинга логов и проверки форматов.
  • В Bash 4+ появились ассоциативные массивы — можно строить более сложную логику с if-else и циклами.
  • С помощью if-else можно реализовать простейший watchdog для сервисов — скрипт, который периодически проверяет и перезапускает упавшие процессы.

Какие новые возможности открываются и чем это поможет в автоматизации и скриптах?

  • Автоматизация рутинных задач: бэкапы, мониторинг, алерты, автозапуск сервисов.
  • Гибкая обработка ошибок: скрипт сам решает, что делать при сбое (перезапустить, отправить уведомление, логировать).
  • Интерактивные скрипты: можно спрашивать у пользователя, что делать дальше, в зависимости от условий.
  • Интеграция с cron: запускать проверки по расписанию и реагировать на события.
  • Быстрая адаптация под разные окружения: один и тот же скрипт можно использовать на разных серверах, просто меняя условия.

Вывод — заключение и рекомендации

if-else — это фундамент автоматизации в Bash. Без него скрипты превращаются в набор тупых команд, которые не умеют реагировать на реальную ситуацию на сервере. Освоив условную логику, ты сможешь:

  • Делать свои скрипты умнее и надёжнее
  • Автоматизировать рутину и экономить время
  • Быстро реагировать на сбои и нестандартные ситуации
  • Строить свои мини-системы мониторинга и автозапуска

Рекомендую всегда использовать [[ ]] для сложных условий, не забывать про кавычки вокруг переменных и обязательно обрабатывать все ветки условий. Если задача становится слишком сложной — подумай о переходе на case или даже на Python, но для 90% серверных задач if-else в Bash — это must-have.

Если хочешь протестировать свои навыки на практике — заказывай VPS или выделенный сервер и начинай автоматизировать всё, что только можно. А если остались вопросы — смотри официальную документацию Bash или спрашивай на Stack Overflow.

Прокачивай свои скрипты, автоматизируй серверы и не забывай: хороший админ — это ленивый админ, который всё автоматизировал!


В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.

Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.

Leave a reply

Your email address will not be published. Required fields are marked