В 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 проверяет типы файлов и сравнивает значение. Возвращает 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 $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 в Bash проверяет переменную не через числовые сравнения, а через сопоставление со строковыми шаблонами (glob-маски).
Синтаксис:
case $var in шаблон1) команды ;; шаблон2) команды ;; *) команды по умолчанию ;; esac
Задача | Пример |
---|---|
Конкретные значения | 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 $num in >10) echo "больше 10" ;; # ❌ Ошибка esac
Если нужно именно числовое сравнение, используйте:
if (( num > 10 && num < 20 )); then echo "число между 10 и 20" fi
if [[ $num =~ ^[0-9]{2}$ ]]; then echo "двузначное число" fi
Конструкция | Для чего подходит лучше |
---|---|
case | Когда нужно проверить переменную на совпадение с фиксированными значениями или по шаблону (маски, количество символов). |
if | Когда нужно выполнять арифметические сравнения: больше, меньше, диапазоны, вычисления. |
Особенность | Описание |
---|---|
Несколько шаблонов | Можно указать через `|`, например: status|info |
Маски | Можно использовать `*`, `?`, `[ ]`, как в glob-шаблонах |
Обязательные ;; | После каждой ветки нужно завершать `;;` (иначе пойдёт дальше) |
Ветка по умолчанию | Обозначается через `*` |