Условные выражения в 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 ]] правда, если файл можно выполнять |