Статья также доступна на украинском (перейти к просмотру).

Оглавление
В предыдущих двух статьях мы обсудили базовые понятия и методы использования bash, а также языковые конструкции и переменные, теперь давайте поговорим об условных операторах.
Оболочка bash не была бы столь эффективной и популярной среди специалистов, если бы не имела внутренних программных средств для создания достаточно сложных сценариев, отвечающих всем требованиям структурного программирования. Одним из таких средств являются операторы ветвления. В bash они имеют некоторые особенности. Поговорим об этом и проверим их работу на практике.
Обзор управляющих конструкций Bash для обработки данных
Bash представляет собой командный процессор с широкими возможностями для императивного программирования, когда программы строятся в форме последовательного списка приказов или команд для интерпретатора. Так же, как и для большинства императивных языков программирования (C, C++, Java), в bash bash поддерживается структурный подход для организации программ, который заключается в представлении программы в виде иерархической структуры или блоков. В соответствии с указанным подходом любая программа, не содержащая операторов безусловного перехода, строится с использованием трех управляющих форм или конструкций:
- Последовательность;
- Ветвление;
- Циклы.
Последовательность является простейшей формой организации вычислений, не требующей наличия дополнительных конструкций или структур и поэтому не вызывает сложностей в использовании.
Наиболее сложными формами являются ветвления и циклы. Они позволяют производить более сложную обработку числовых и текстовых данных, что значительно повышает уровень «интеллекта» сценариев. Рассмотрим более подробно существующие формы реализации ветвления в bash.
Операторы ветвления
Операторы ветвления применяются в случаях, когда определенный набор команд должен выполняться или не выполняться в зависимости от условий или условий. Для всех императивных языков программирования, так же, как и для языковых средств bash, существуют следующие формы реализации ветвления:
- Условный оператор;
- Оператор многозначного выбора.
Условный оператор
Условный оператор является более простой формой управления данными, обеспечивающей выполнение определенных команд при условии истинности значения логического выражения, обычно и является основным условием для их выполнения.
В большинстве языков программирования, как и bash, для этой цели используется конструкция if, что в переводе означает «или». Она может иметь одно или несколько ветвлений, обозначаемых оператором elif. Общая синтаксическая форма оператора if имеет следующий вид:
if [[умова 1]];
then
Команда 1
.......
Команда N
elif [[условие 2 ]];
then
Команда 1
.......
Команда N
..................
elif [[условие M ]];
then
Команда 1
.......
Команда N
else
Команда 1
.......
Команда N
fi
В данном случае осуществляется так называемое каскадирование условных операторов с помощью операторов elif. Общее количество ветвлений – M. Работа всего блока производится следующим образом. В случае выполнения условия №1 (возвращается значение True) выполняются команды, указанные после ближайшего оператора then. После этого происходит переход к конечному оператору fi и работа программы завершается. Если же условие № 1 не выполняется (возвращается значение False), тогда поочередно обрабатываются все условные операторы каскада, пока какое-либо из условий не вернет значение True.
В случае, если ни одно из M условий не было выполнено, идет переход к выполнению команд, расположенных за оператором else. После того, как все они будут обработаны, происходит переход к конечному оператору fi и работа программы завершается.
Рассмотренный вариант является самым сложным. Чаще встречаются сокращенные версии конструкции if, где может быть только одно ветвление, или, например, может вообще не быть альтернативных команд, определяемых конструкцией else.
В bash поддерживается набор операторов и параметров, которые могут быть использованы в формировании логического выражения или условий. Приведем несколько из них.
-a file - Возвращается значение True, если файл существует;
-c file - True, если файл является специальным символом;
-d file - True, если файл является директорией;
-s file - True, если файл существует и не пуст;
file1 -ot file2 - True, если файл file1 білее старый, чем file2;
-z STRING - True, если текстовая строчка пуста;
-v VAR - True, если установлена ??переменная VAR;
! EXPR - True, если значением выражения является False;
EXPR1 -a EXPR2 - True,если оба выражения верны;
EXPR1 -o EXPR2 - True, если какое-либо из выражений верно;
arg1 АО arg2 - возвращаемое значение в зависимости от результата арифметической операции между операндами
Где file – имя файла EXPR – выражение, АО – арифметический оператор (-eq, -ne, -lt, -le, -gt, or –ge).
Вообще же, благодаря имеющейся у bash мощной справочной службы можно ознакомиться со всеми доступными параметрами с помощью команды с соответствующим параметром. Введем в терминале:
$ help test


Например, создадим сценарий с именем lesson_if, который будет сравнивать введенное пользователем число с нулем. Введем в терминале:
$ nano lesson_if.sh
В созданном файле введем следующий код:
#!/bin/bash #Сравнение введенного пользователем числа с нулем echo "Пожалуйста, введите любое число" read numeric1 if [ $numeric1 -gt 0 ]; then echo "$numeric1 больше нуля!" elif [ $numeric1 -lt 0 ]; then echo "$numeric1 меньше нуля!" else echo "$numeric1 равно нулю!" fi

Сохраним внесенные изменения (ctrl+O, Enter) и выйдем из редактора (ctrl+X).
Теперь запустим на исполнение созданный сценарий. Для этого введем в терминале:
$ bash lesson_if.sh


Как видим, сценарий работает так, как нужно.
Оператор многозначного выбора
Операторы многозначного выбора являются еще одной формой реализации ветвления. В каждом из императивных языков программирования используются свои конструкции для этой цели. Например, в языках программирования C и JavaScript это оператор switch, а в bash – оператор case. Такие конструкции обычно используются для замены каскадов или группы вложенных условных операторов if, что позволяет упростить код и сделать его более читабельным и легким в использовании.
Приведем общую синтаксическую форму оператора case:
case Выражение in
Шаблон_1)
Операторы
;;
Шаблон_2)
Операторы
;;
........
Шаблон_N)
Операторы
;;
*)
Операторы
;;
esac
Сущность работы оператора case состоит в последовательном поиске соответствия шаблонов указанному выражению. В случае, если такое соответствие будет найдено, начинают выполняться операторы, следующие за соответствующим шаблоном. После этого следует переход к конечной конструкции esac и программа завершает свою работу. Если же никакого соответствия не было найдено, выполняются операторы, указанные после конструкции «*)» и уже после этого работа программы завершается.
Указанный алгоритм работы отличается от алгоритма аналогичного оператора switch, используемого в языке программирования C. Там после обнаружения первого соответствия и выполнения команд работа оператора не завершается, а продолжается поиск других соответствий, и так будет до тех пор, пока не будут обработаны все шаблоны. И это существенное отличие, которое нужно учитывать в дальнейшем.
Сформулируем основные правила использования оператора case:
- Конструкция должна начинаться с ключевого слова «case», за которым следует выражение и ключевое слово «in»;
- Можно использовать несколько шаблонов, разделенных символом «|», при этом оператор «)» завершает их список;
- Каждый блок «шаблон – операторы» должен оканчиваться знаками «;;»;
- Шаблон может содержать специальные символы;
- Выполняются только команды, соответствующие первому шаблону;
- Конструкция «*)» используется в качестве конечного шаблона, установленного по умолчанию;
- Если ни один из шаблонов не соответствует, статус возврата равен нулю. В противном случае статус возврата является статусом выхода исполненных команд.
Создадим сценарий, в котором будет продемонстрирована работа оператора case. Сущность сценария заключается в автоматическом определении языка страны, вводимого пользователем. Результат, то есть определенный язык, выводится на терминал.
Введем в термінале команду создания файла сценарію:
$ nano lesson_case.sh
В открывшемся окне редактора введем следующий код:
#!/bin/bash
echo -n "Введите название страны: "
read CNTR
echo -n "Языком страны $COUNTRY является "
case $CNTR in
Ukraine)
echo -n "Украинский"
;;
Britannia | USA)
echo -n "Английский"
;;
Germany | Austria | Switzerland)
echo -n "Немецкий"
;;
*)
echo -n "Не определено"
;;
esac

Сохраним файл (ctrl+O, Enter) и выйдем из редактора (ctrl+X).
После этого запустим на исполнение наш сценарий. Введем в терминале:
$ bash lesson_case.sh

После ввода значения «Ukraine» и подтверждения ввода получим следующий результат:

То есть, язык указанного в запросе сценария страны определен верно.
В следующей статье поговорим о еще одной управляющей конструкции bash – циклах и все, что с ними связано. Также рассмотрим совместную работу условных операторов и циклов. Следите за нашим телеграм-каналом.
Якщо Вам нужен надежный виртуальный сервер с локацией в Украине или Польше, дата-центр FREEhost.UA может предоставить Вам за считанные минуты после оплаты. Широкий выбор шаблонов для автоматической настройки сервера, круглосуточная техническая поддержка, высокий uptime, бесплатные бекапы, гарантированные выделенные ресурсы, это лишь часть преимуществ нашего сервиса.
Смотрите наш канал Youtube на https://www.youtube.com/freehostua.
Мы в чем-то ошиблись, или что-то пропустили?
Напишите об этом в комментариях на сайте и в телеграм-канале. Мы с удовольствием ответим и обсудим Ваши замечания и предложения.
|
Дата: 13.04.2023 Автор: Александр Ровник
|
|

Авторам статьи важно Ваше мнение. Будем рады его обсудить с Вами:
comments powered by Disqus