Условные операторы if else в Bash и shell-скриптах

Условные выражения это ключевой элемент любого языка программирования. В shell-скриптах на Bash они позволяют принимать решения, выполняя одну команду, если условие истинно, и другую, если оно ложно. Это особенно важно, когда вы не хотите выполнять каждую команду безоговорочно и хотите управлять поведением вашего скрипта в зависимости от ситуации.

Что такое if-else в shell-скриптах

В Bash условный оператор if-else служит для выполнения различных блоков кода в зависимости от того, истинно ли заданное условие. Он помогает адаптировать логику скрипта под разные входные данные, условия среды или результаты предыдущих операций.

Основной синтаксис

Простейшая форма выглядит так:

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

Здесь:

  • ifи then определяют начало блока проверки;

  • else - ветку, выполняемую при ложном условии;

  • fi - обязательный маркер конца блока.

Основные правила

  • Очень важны пробелы вокруг квадратных скобок [ ]. Bash чувствителен к синтаксису.

  • Переменные и команды чувствительны к регистру. Var и var - это разные вещи.

  • Хотя многие конструкции работают в разных оболочках POSIX, примеры с [[ ... ]] и (( ... )) специфичны для Bash.

Примеры использования

Ниже распространённые сценарии с пояснениями.

Проверка равенства двух чисел

#!/bin/bash
m=1
n=2

if [ "$n" -eq "$m" ]
then
    echo "Обе переменные одинаковы"
else
    echo "Переменные разные"
fi

Результат:

Переменные разные

Оператор -eq сравнивает числовые значения переменных.

Сравнение двух чисел

#!/bin/bash
a=2
b=7

if [ "$a" -ge "$b" ]
then
    echo "a больше или равно b"
else
    echo "b больше a"
fi

Здесь -ge означает "больше или равно".

Проверка чётности числа

#!/bin/bash
n=10

if (( n % 2 == 0 ))
then
    echo "Число чётное"
else
    echo "Число нечётное"
fi

Используется арифметическое выражение (( ... )), которое позволяет писать более чистые условия.

Простейшая проверка пароля

#!/bin/bash
echo "Введите пароль:"
read pass

if [ "$pass" = "password" ]
then
    echo "Пароль верный"
else
    echo "Неверный пароль, попробуйте ещё раз"
fi

Оператор = сравнивает строки.

Несколько условий: elif

Если нужно проверить несколько условий подряд, можно использовать elif, что делает код читаемее:

#!/bin/bash
grade=85

if [ "$grade" -ge 90 ]; then
    echo "Оценка: A"
elif [ "$grade" -ge 80 ]; then
    echo "Оценка: B"
elif [ "$grade" -ge 70 ]; then
    echo "Оценка: C"
else
    echo "Оценка: F"
fi

Таким образом можно последовательно проверять диапазоны значений.

Простые бинарные решения

Частый случай выбрать одно из двух действий на основе условия:

#!/bin/bash
file_path="/path/to/your/file.txt"

if [ -f "$file_path" ]; then
    echo "Файл существует"
else
    echo "Файл не найден"
fi

Тест -f проверяет, существует ли файл по указанному пути.

Вложенные условия

При сложной логике можно вкладывать if-else друг в друга:

#!/bin/bash
num=10

if [ "$num" -ge 5 ]; then
    if [ "$num" -le 15 ]; then
        echo "Число в диапазоне"
    else
        echo "Число выше диапазона"
    fi
else
    echo "Число ниже диапазона"
fi

Такой код сначала проверяет одно условие, а затем, при необходимости, ещё одно внутри.

Проверка прав доступа к файлу

Можно комбинировать проверки:

#!/bin/bash
file_path="/path/to/your/file.txt"

if [ -f "$file_path" ]; then
    if [ -r "$file_path" ]; then
        echo "Файл существует и доступен для чтения"
    else
        echo "Файл есть, но его нельзя прочитать"
    fi
else
    echo "Файл не существует"
fi

Тест -r проверяет право на чтение.

Валидация ввода пользователя

Пример проверки числового ввода:

#!/bin/bash
echo "Введите первое число:"
read num1
echo "Введите второе число:"
read num2

if [[ $num1 =~ ^[0-9]+$ ]] && [[ $num2 =~ ^[0-9]+$ ]]; then
    echo "Оба числа корректны"
else
    echo "Один или оба ввода некорректны. Введите валидные числа."
fi

Здесь используется регулярное выражение для проверки, что введены только цифры.

Часто задаваемые вопросы

Как написать простой if?

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

Например, чтобы проверить существование файла:

if [ -f file.txt ]; then
   echo "Файл есть"
fi

Как использовать несколько условий?

Через elif или логические операторы && и ||:

if [ "$var" -ge 5 ] && [ "$var" -le 15 ]; then
   echo "В диапазоне"
fi

Чем можно заменить if-else?

Альтернативой служит оператор case, когда нужно сравнивать переменную с несколькими шаблонами:

case $var in
    1) echo "1";;
    2) echo "2";;
    *) echo "Другие";;
esac

Условные операторы if-else это фундаментальная часть логики bash-скриптов. Они позволяют управлять потоком выполнения, делать скрипты гибкими и адаптивными, а также эффективно обрабатывать входные данные или состояние системы.

Комментарии (0)

Войдите, чтобы оставить комментарий

Похожие статьи

Почему простые архитектуры выигрывают: уроки системного дизайна от инженера GitHub

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

40 0 1 мин