Содержание

Условия IF THEN ELSE

Полезные ссылки:

В Bash условия пишутся внутри if … fi и чаще всего проверяются через команду test или её сокращение — квадратные скобки […]. Вот основные моменты: 0 - true, 1 - ошибка

🔹 Синтаксис

if [ УСЛОВИЕ ]; then
    # команды, если условие истинно(команда вернула 0)
else
    # команды, если условие ложно(команда вернула не 0)
fi
 
 
if ls /etc/passwd;
then
 echo File OK;
else 
 echo No file;
fi
 
if условие1; then команды1; elif условие2; then команды2; else команды3; fi

Можно писать компактно в одну строку:

if [ УСЛОВИЕ ]; then echo "OK"; fi

Команда test

Команда test проверяет типы файлов и сравнивает значение. Возвращает 0 если True, 1 если False Больше информации о test

# Сравнение переменной со строкой
test "$MY_VAR" == "/bin/zsh"
 
# Проверка, если переменная пустая
test -z "$GIT_BRANCH"
 
# Проверка на существование файла
test -f "path/to/file_or_directory"
 
# Проверка на существование папки
test ! -d "path/to/directory"
 
# If A is true, then do B, or C in the case of an error (notice that C may run even if A fails):
test condition && echo "true" || echo "false"

Проверка чисел

Оператор Описание Пример
-eq равно
if [ "$a" -eq 5 ]; then echo "a=5"; fi
-ne не равно
if [ "$a" -ne 0 ]; then echo "a!=0"; fi
-lt меньше
if [ "$a" -lt 10 ]; then echo "a<10"; fi
-le меньше или равно
if [ "$a" -le 5 ]; then echo "a<=5"; fi
-gt больше
if [ "$a" -gt 3 ]; then echo "a>3"; fi
-ge больше или равно
if [ "$a" -ge 7 ]; then echo "a>=7"; fi

Проверка строк

Оператор Описание Пример
= строки равны
if [ "$str" = "root" ]; then echo "root"; fi
!= строки не равны
if [ "$str" != "admin" ]; then echo "не admin"; fi
-z строка пустая
if [ -z "$str" ]; then echo "пусто"; fi
-n строка не пустая
if [ -n "$str" ]; then echo "есть значение"; fi

Проверка файлов и директорий

Оператор Описание Пример
-e file существует ли файл/каталог
if [ -e file.txt ]; then echo "есть"; fi
-f file является обычным файлом
if [ -f file.txt ]; then echo "файл"; fi
-d dir является каталогом
if [ -d /etc ]; then echo "каталог"; fi
-r file файл читаемый
if [ -r file.txt ]; then echo "читается"; fi
-w file файл доступен для записи
if [ -w file.txt ]; then echo "записывается"; fi
-x file файл исполняемый
if [ -x script.sh ]; then echo "запускается"; fi

Логические операторы

Оператор Описание Пример
-a или && И (AND)
if [ "$a" -gt 0 -a "$a" -lt 10 ]; then echo "от 1 до 9"; fi
-o или || ИЛИ (OR)
if [ "$user" = "root" || "$user" = "admin" ]; then echo "OK"; fi
! НЕ
if [ ! -f file.txt ]; then echo "нет файла"; fi

Расширенный синтаксис [[ ]]

Примеры:

if [[ $a -ge 10 && $a -le 20 ]]; then
    echo "a между 10 и 20"
fi
 
if [[ $text =~ ^[0-9]+$ ]]; then
    echo "text состоит из цифр"
fi

Пример с параметрами

#!/bin/bash
 
if [[ $# -lt 5 ]]; then
    echo "Нужно минимум 5 параметров!"
    exit 1
fi
 
if [[ $1 = "start" ]]; then
    echo "Запуск..."
elif [[ $1 = "stop" ]]; then
    echo "Остановка..."
else
    echo "Неизвестная команда: $1"
fi

Арифметические выражения (( ))

Примеры:

a=7
b=12
 
if (( a > 5 && b < 20 )); then
    echo "Оба условия выполняются"
fi
 
if (( a % 2 == 1 )); then
    echo "a нечётное"
fi
 
if (( (a + b) > 15 )); then
    echo "Сумма больше 15"
fi

Сравнение [[ ]] и (( ))

Синтаксис Для чего лучше использовать
[[ ... ]] строки, шаблоны, регулярные выражения
(( ... )) числа, арифметика, сравнения как в C

Пример сравнения:

# Проверка строки
if [[ $user = "root" ]]; then
    echo "Привет, root!"
fi
 
# Проверка числа
if (( count >= 10 )); then
    echo "count >= 10"
fi

Условный оператор case

Синтаксис:

case $var in
    шаблон1)
        команды
        ;;
    шаблон2|шаблон3)
        команды
        ;;
    *)
        команды по умолчанию
        ;;
esac

Примеры:

#!/bin/bash
 
action=$1
 
case $action in
    start)
        echo "Запуск службы..."
        ;;
    stop)
        echo "Остановка службы..."
        ;;
    restart)
        echo "Перезапуск службы..."
        ;;
    status|info)
        echo "Проверка состояния..."
        ;;
    *)
        echo "Неизвестная команда: $action"
        echo "Использование: $0 {start|stop|restart|status}"
        ;;
esac

Сравнение чисел в case и if

Как работает case

Оператор case в Bash проверяет переменную не через числовые сравнения, а через сопоставление со строковыми шаблонами (glob-маски).

Синтаксис:

case $var in
    шаблон1) команды ;;
    шаблон2) команды ;;
    *) команды по умолчанию ;;
esac

Примеры проверки чисел через case

Задача Пример
Конкретные значения
num=5
case $num in
    1) echo "один" ;;
    2) echo "два" ;;
    5) echo "пять" ;;
    *) echo "другое число" ;;
esac
Диапазоны по шаблонам
num=123
case $num in
    [0-9]) echo "однозначное число" ;;
    [1-9][0-9]) echo "двузначное число" ;;
    [1-9][0-9][0-9]) echo "трёхзначное число" ;;
    *) echo "что-то другое" ;;
esac
Количество цифр
num=4567
case $num in
    ?)   echo "1 знак" ;;
    ??)  echo "2 знака" ;;
    ???) echo "3 знака" ;;
    *)   echo "4 и больше знаков" ;;
esac

Ограничения case

* Нельзя использовать операторы `<`, `>`, `>=`, `⇐` внутри case. * Например, это не сработает:

case $num in
    >10) echo "больше 10" ;;   # ❌ Ошибка
esac

Когда использовать if

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

  if (( num > 10 && num < 20 )); then
      echo "число между 10 и 20"
  fi
 
  if [[ $num =~ ^[0-9]{2}$ ]]; then
      echo "двузначное число"
  fi
 

Сравнение if и case

Конструкция Для чего подходит лучше
case Когда нужно проверить переменную на совпадение с фиксированными значениями или по шаблону (маски, количество символов).
if Когда нужно выполнять арифметические сравнения: больше, меньше, диапазоны, вычисления.

Итог

Особенности case

Особенность Описание
Несколько шаблонов Можно указать через `|`, например: status|info
Маски Можно использовать `*`, `?`, `[ ]`, как в glob-шаблонах
Обязательные ;; После каждой ветки нужно завершать `;;` (иначе пойдёт дальше)
Ветка по умолчанию Обозначается через `*`