Условные выражения в Bash

Условные выражения в Bash #

Андрей Михайлович Васильев, 2025

Версии презентации


Возвращаемое значение #

Стандартное определение функции main на языке Си:

int main(int argc, char* argv[], char** envp) {...}
  • int argc — количество аргументов
  • char* argv[] — массив с аргументами
  • char** envp — массив с переменными окружения в формате КЛЮЧ=ЗНАЧЕНИЕ
  • int main, метод возвращает целое значение, обозначающее результат выполнения
    • 0 — программа выполнила все действия корректно
    • !=0 — во время работы программы возникли ошибки, некорректное завершение

Проверка возвращаемого значения в Bash #

В BASH переменная ? позволяет узнать статус выполнения последней команды

$ ls
$ echo $?
0
$ ls /aoeb &> /dev/null
$ echo $?
2

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

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

Синтаксис:

if list; then list;
[ elif list; then list; ] ...
[ else list; ]
fi

Если последняя команда из списка в условии вернёт 0, тогда будут выполнены команды в then-списке, в противном случае будет протестированы команды из elif


Список команд #

Под списком подразумевается последовательность одного или нескольких конвейеров, разделённых одним из операторов: ;, &, && или ||

Результат работы конвейера — код возврата последней команды

  • Оператор & означает, что конвейер слева запустится в фоновом режиме, а команда справа запустится сразу после него
  • Оператор ; означает, что конвейер справа запустится после конвейера слева. Результат работы списка — результат последней команды
  • Оператор && означает, что конвейер справа запустится, если конвейер слева завершился с положительным результатом. Логическое И
  • Оператор || означает, что конвейер справа запустится, если конвейер слева завершился с отрицательным результатом. Логическое ИЛИ

Последние операции можно использовать, чтобы выполнить несколько команд за один ввод


Приложение test #

Приложение позволяет проверить некоторые выражения и вернуть 1 или 0

test ВЫРАЖЕНИЕ
[ ВЫРАЖЕНИЕ ]

Написанное выражение подвергается обработке со стороны BASH как обычная строка, а после передаётся для выполнения в приложение test

У приложения есть также альтернативное название: [, что позволяет записывать

[ ВЫРАЖЕНИЕ ]
[ -f /tmp/data ] # Файл /tmp/data существует и является файлом

Выражение if становится похожим на программу

if [ -f /tmp/data ]; then
  echo "Файл существует"
fi

Встроенная команда Bash [[ #

Данная команда является расширением приложения test и исправляет ряд его ограничений. Рекомендуется к использованию вместо приложения test

Ключевые отличия:

  • Внутри команды [[ ]] не происходит расширения строк
  • Можно использовать &&, || внутри выражения
  • Легче группировать выражения с помощью (...)

Команду [[ следует использовать для сравнения строк и проверки файлов

Комбинирование проверок в test #

Несколько проверок можно объединить с помощью &&, || на уровне Bash:

[ -f /tmp/data ] || { [ -f /tmp/info ] && [ -f /tmp/more ] }

Операторы && и || работают на уровне результатов работы приложения


Строковые проверки команд test и [[ #

Строковые проверки отличаются

[[ test Пример
> \> [[ a > b ]] ложь, a идёт раньше b
< \< [[ az < za ]] правда, a идёт раньше z
=, == = [[ a = a ]] правда, a равно a
!= != [[ a != b ]] правда, a не равно b
=, == нет [[ name = n* ]] правда, name начинается с n
=~ нет [[ home =~ ^h+ ]] правда, home соответствует выражению
-z -z [[ -z $info ]] правда, если строка в $info нулевой длины
-n -n [[ -n $data ]] правда, если строка в $data ненулевой длины

Числовые проверки команд test и [[ #

Числовые проверки между test и [[ не отличаются

Проверка Пример
-gt [[ 5 -gt 10 ]] ложь, 5 меньше 10
-lt [[ 8 -lt 9 ]] правда, 8 меньше 9
-eq [[ 5 -eq 3 ]] ложь, 5 не равно 3
-ne [[ 5 -ne 3 ]] правда, 5 не равно 3
-ge [[ 3 -ge 3 ]] правда, 3 больше или равно 3
-le [[ 3 -le 8]] правда, 3 меньше или равно 8

Файловые проверки команд test и [[ #

Проверка Пример
-a [[ -a /tmp/data ]] правда, если файл существует
-d [[ -d /var/log ]] правда, если директория существует
-e [[ -e /run/info.pid ]] правда, если файл существует
-f [[ -f /tmp/test ]] правда, если существует и является файлом
-r [[ -r ~/info ]] правда, если файл доступен на чтение
-w [[ -w ~/result ]] правда, если файл доступен на запись
-x [[ -x ~/bin/run ]] правда, если файл можно выполнять

© A. M. Васильев, 2025, CC BY-SA 4.0, andrey@crafted.su