Как записать условный оператор if в одну строку в Bash?

Ответ

В Bash для записи условия в одну строку используется компактный синтаксис с точкой с запятой (;).

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

if [ условие ]; then команда; fi

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

  1. Проверка существования файла или директории:

    if [ -f "/etc/config.yaml" ]; then echo "Конфиг найден"; fi
    if [ ! -d "/backup" ]; then mkdir -p /backup; fi
  2. Сравнение строк и чисел:

    if [ "$ENV" = "production" ]; then echo "Запуск в prod"; fi
    if [ $COUNT -gt 10 ]; then echo "Превышен лимит"; fi
  3. Использование && и || как альтернативы if-then-else: Это более идиоматичный способ для простых проверок.

    # Если условие истинно, выполнить команду
    [ -f "/var/run/process.pid" ] && echo "Процесс уже запущен"
    
    # Если условие ложно, выполнить команду
    [ -z "$HOST" ] || echo "Хост установлен в $HOST"
    
    # Аналог if-else
    [ "$STATUS" = "OK" ] && echo "Успех" || echo "Ошибка"

    Важно: Конструкция && и || работает на основе кода возврата предыдущей команды (0 — успех, не 0 — ошибка).

  4. Группировка нескольких команд с помощью { }:

    # Если файл существует, вывести его содержимое и размер
    [ -f "app.log" ] && { echo "--- Лог ---"; cat app.log; echo "Размер: $(wc -l < app.log) строк"; }

Рекомендация: Для сложной логики или многострочных действий лучше использовать стандартный многострочный if, так как это улучшает читаемость и поддерживаемость скрипта.

Ответ 18+ 🔞

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

Короче, смотри. Если тебе прям позарез надо всё впихнуть в одну строку, то делается это через точку с запятой, как будто ты пишешь обычный if, но не переносишь строки.

Вот как это выглядит в лоб:

if [ условие ]; then команда; fi

Теперь живые примеры, чтобы не быть голословным:

  1. Проверить файл, чтобы не облажаться:

    if [ -f "/etc/config.yaml" ]; then echo "Конфиг найден"; fi
    if [ ! -d "/backup" ]; then mkdir -p /backup; fi

    Тут всё просто: есть файл — окей, нет директории — создаём. Ёпта, главное, кавычки не забывай для переменных, а то будет тебе хиросима.

  2. Сравнить что-нибудь:

    if [ "$ENV" = "production" ]; then echo "Запуск в prod, бздеть будем"; fi
    if [ $COUNT -gt 10 ]; then echo "Превышен лимит, овердохуища"; fi
  3. А вот это, чувак, важно! Часто вместо if можно использовать операторы && и ||. Это как раз тот самый идиоматичный, крутой способ.

    # Если условие истинно (команда вернула 0), то делаем что-то справа от &&
    [ -f "/var/run/process.pid" ] && echo "Процесс уже запущен, иди на хуй"
    
    # Если условие ложно (вернуло не 0), то делаем что-то справа от ||
    [ -z "$HOST" ] || echo "Хост установлен в $HOST"
    
    # Аналог if-else в одну строку. Осторожно, тут есть подвох!
    [ "$STATUS" = "OK" ] && echo "Успех" || echo "Ошибка"

    С последним примером — внимание, ебать! Конструкция команда1 && команда2 || команда3 работает НЕ совсем как if-else. Если команда2 сама завершится с ошибкой, то выполнится и команда3. Так что для настоящего if-else лучше использовать нормальный синтаксис, а эту штуку — только для простейших команд, которые гарантированно не сломаются.

  4. Если нужно несколько команд, их можно сгруппировать в { }:

    # Если файл есть, выводим заголовок, содержимое и размер
    [ -f "app.log" ] && { echo "--- Лог ---"; cat app.log; echo "Размер: $(wc -l < app.log) строк"; }

Итог и моя главная рекомендация, блядь: Не гонись за одной строкой, если логика сложнее, чем «проверил — сказал». Для всего многострочного, с вложенностями и ветвлениями, используй нормальный, читаемый if-elif-else. Твой скрипт через месяц будет смотреть на тебя, как на пидараса шерстяного, и ты сам в нём ничего не поймёшь. Читаемость — это святое. Однострочники — для быстрых проверок в консоли или совсем уж простых случаев. Не делай из скрипта манду с ушами.