Статья также доступна на украинском (перейти к просмотру).
Оглавление
В предыдущих статьях мы рассмотрели основные концепции использования bash и рассмотрели работу таких управляющих конструкций, как разветвление. Здесь мы сосредоточимся на изучении работы циклов и основных типов выражений bash, которые помогают Администратору решать срочные потребности в управлении системой.
Циклы и способы их использования
Циклы являются одним из основных типов управляющих языковых конструкций bash, позволяющих в полной мере реализовать возможности структурного подхода в программах сценариев. Они предназначены для организации многократного выполнения набора команд, образующих тело цикла. Процесс выполнения цикла включает:
- Начальная инициализация переменных;
- Проверку условия выхода или завершения;
- Выполнение тела цикла;
- Обновление переменной по каждой итерации.
В bash, как и в большинстве императивных языков программирования, поддерживается несколько разновидностей циклов, что позволяет расширить пространство для их использования. Это такие конструкции:
- For;
- While;
- Until.
Ниже рассмотрим более подробно синтаксис и особенности работы каждой из указанных конструкций.
Цикл For
Этот оператор является наиболее употребительным из-за своей гибкости в настройке синтаксиса в зависимости от задач. Его общий синтаксис выглядит следующим образом:
for VARIABL in [список елементов] do [список команд] done
Разъясним назначение каждого из операторов и параметров.
VARIABL – слово, которое может состоять из латинских букв и цифр и является заполнителем для переменной. При этом $VARIABL – индивидуальное значение переменной.
in – служебный ключ, отделяющий переменную от элементов списка.
[список елементов] – значения, последовательно или по определенному алгоритму принимает переменная $VARIABL. Метод выбора может зависеть от версии bash. Для версий <3.0 список выглядит так: 1 2 3 ..... N. Начиная с версии 3.0, тот же список реализуется с помощью символов «..», например: {1..N}. Из версии 4.0 стало возможным использование конструкции типа {START..END..INCREMENT}, где START – начальное значение переменной $VARIABL, INCREMENT – шаг итерации, END – конечное значение переменной. Предыдущий список будет выглядеть следующим образом: {1..N..1}. Очевидно, это более компактная и более удобная форма записи элементов по сравнению с другими.
do – служебное ключевое слово, запускающее итерацию обработки тела цикла. В простейшем случае, при отсутствии операторов прерывания и перехода, количество итераций будет равно количеству элементов из списка.
[список команд] – команды, образующие тело цикла.
done – оператор остановки цикла.
Существует также синтаксис оператора for для организации работы двух циклов и более. Например, для двух циклов синтаксис оператора может выглядеть следующим образом:
for VARIABL in [список елементов] do command_1 on $VARIABL ....... command_M done
Для примера, рассмотрим разные варианты использования указанного оператора. Однако для начала выясним версию оболочки bash, которая установлена ??на нашем Ubuntu. Это позволит сориентироваться, что касается ее возможностей. Для этого введем в терминале:
echo $BASH_VERSION
Итак, в системе установлена ??новая версия bash 5.0.17.
Введем команду создания файла сценария:
$ nano lesson_for1.sh
В открывшемся окне редактора введем следующий код:
#!/bin/bash for color in White Yellow Green Blue Black do echo "Кольор: $color" done
В сценарии используется самый простой вариант списка элементов. Суть его работы заключается в выводе на терминал списка цветов, упорядоченных по светлости тона – сначала более светлые, а затем более темные. Сохраним внесенные изменения (ctrl+O, Enter) и выйдем из редактора (ctrl+X).
Теперь запустим созданный сценарий. Для этого введем в терминале:
$ bash lesson_for1.sh
В результате, мы видим цветовой вывод в том порядке, который был в списке элементов оператора for.
Используем оператор для создания нескончаемого цикла. Для этого создадим новый файл сценария:
$ nano lesson_for2.sh
Добавим в редакторе следующий код:
#!/bin/bash for (( ; ; )) do echo "Цикл бесконечный!" done
Выходом сценария должна быть постоянно генерируемая фраза «Цикл бесконечный!». Прервать процесс можно с помощью клавиш «ctrl+C». Сохраним изменения и выйдем из редактора.
Запустим сценарий. Для этого введем:
$ bash lesson_for2.sh
Можно убедиться, что этот цикл действительно нескончаем.
Теперь создадим сценарий с использованием более сложного варианта записи списка элементов типа – типа {START..END..INCREMENT}, назначение которого мы уже рассматривали.
Запустим редактор:
$ nano lesson_for3.sh
Введем следующий код:
#!/bin/bash for (( k=1; k<=9; k++ )) do echo "Натуральное число $k" done
Код будет выводить ряд натуральных чисел до тех пор, пока не выполнится условие завершения цикла, указанное в логическом выражении (END-части), то есть в число 9 включительно. Закроем редактор и запустим сценарий:
$ bash lesson_for3.sh
Как видим, код работает.
Теперь продемонстрируем работу оператора for вместе с конструкцией continue, посредством которой могут игнорироваться определенные итерации цикла в зависимости от условий. Для этого введем команду вызова редактора:
$ nano lesson_for4.sh
Введем созданный нами код:
#!/bin/bash for j in {0..9} do if [[ "$j" == '8' ]] then continue fi echo "Число $j" done
В указанном коде для формирования условия пропуска итерации №8 используется оператор разветвления if. Сохраним изменения и выйдем из редактора.
Запустим сценарий:
$ bash lesson_for4.sh
Можно убедиться, что число №8 отсутствует в списке, что предполагалось.
Цикл While
While является еще одной разновидностью циклов, используемых в bash. Сущность его работы заключается в многократном выполнении тела цикла до тех пор, пока указанное условие будет истинным. Как только логическим выражением будет возвращено значение False, работа цикла прекращается. Общий синтаксис оператора выглядит следующим образом:
while [условие] do [список команд] done
Рассмотрим простой пример его использования совместно с оператором приращения «++». Для этого создадим соответствующий файл сценария:
$ nano lesson_while1.sh
В открывшемся окне добавим наш код:
#!/bin/bash #Вывод списка значений, которые меньше или равны указанному числу i=0 while [ $i -le 7 ] do echo $i ((i++)) done
Работа кода заключается в увеличении на единицу переменной $i при каждой итерации. Количество итераций определяется указанным условием. В данном случае, цикл будет выполняться до тех пор, пока значение переменной будет меньше или будет равно числу 7. Сохраним файл и запустим его на выполнение:
$ bash lesson_while1.sh
Итак, получен ожидаемый результат.
Цикл Until
Until является противоположностью While, поскольку здесь цикл будет повторяться, пока указанное условие не станет истинным, то есть, пока логическое выражение не вернет значение True. Для примера, реализуем ту же задачу, что и в предыдущем случае, но с использованием цикла until. Введем в терминале:
$ nano lesson_until1.sh
В появившемся окне программы введем:
#!/bin/bash #Вывод списка значений с помощью оператора until i=0 until [ $i -gt 7 ] do echo $i ((i++)) done
Сохраним изменения и выйдем из программы. Запустим сценарий:
$ bash lesson_until1.sh
Как видим, результат тот же, что и в предыдущем случае.
Выражения в Bash
Любой императивный язык программирования, равно как и bash, обеспечивает поддержку нескольких типов выражений. Это позволяет формировать полноценные условия выполнения для управляющих операторов и выполнять какие-либо вычисления. В bash поддерживаются следующие основные типы выражений:
- Алгебраические;
- Булевые и логические;
- Регулярные.
Рассмотрим указанные типы выражений и продемонстрируем работу с ними.
Алгебраические выражения
Алгебраические выражения могут состоять из нескольких и переменных, связанных между собой с помощью математических операций. Bash поддерживает следующие базовые математические операции:
- +, - - сложение, вычитание;
- ++, -- - инкремент, декремент;
- * - умножение;
- / - деленние;
- % - остаток;
- ** - экспонента.
В сценариях указанные операции можно выполнять с помощью двойных скобок. Продемонстрируем это на практике. Для этого создадим сценарий с реализацией нескольких простых математических операций. Наберем в терминале:
$ nano lesson_matemat1.sh
Введем в файл код трех блоков операций:Введем в файл код трех блоков операций:
#!/bin/bash #Сложение ((a=12)) (( a = a + 3 )) echo $a #Декремент ((b=14)) ((b--)) echo $b #Экспонента ((c=16)) ((c=c**3)) echo $c
Сохраним внесенные изменения и закроем файл. Теперь выполним сценарий:
$ bash lesson_matemat1.sh
Нетрудно убедиться, что все три результата вычислений верны. Это числа 15, 13 и 4096.
Булевые и логические выражения
Булевые и логические выражения в сценариях bash обычно используются внутри условных скобок, которые выглядят так: «(( ))».
Для возможности формирования логических выражений, в bash применяется несколько логических операторов, основными из которых являются оператор | | (логическое ИЛИ) и оператор && (логическое И).
При проверке условий оператор | | возвращает значение 0 (Успех), если хотя бы один из операндов имеет значение True. Оператор && возвращает «успех» только в том случае, если оба операнда имеют значение True.
Приведем пример «работы» указанных операторов. Введем в терминале следующие команды:
$ if (( 1 && 0 && 256)); then echo "true"; else echo "false"; fi
Можно убедиться, что результатом «роботи» условного оператора if является False, что объясняется тем, что, как нами уже было указано выше, операторы && в данном случае могут вернуть только значение 1 (False),поскольку один из операндов имеет значение 0 (False). В этой связи, сконцентрируем внимание на том, что код возврата любой команды в случае ее успешного завершения всегда имеет значение 0, то есть True,в то время как логическое значение True отлично от нуля, что и продемонстрировано приведенным примером. Здесь логическим значением первого из операндов будет True, поскольку он больше нуля. То же касается третьего операнда, также имеющего логическое значение True.
Кроме применения указанных операторов для проверки условий в сценариях, их также можно использовать другим способом, в частности, для одновременного запуска на выполнение нескольких команд в командной строке или в скрипте. Синтаксис такой конструкции выглядит следующим образом:
$ команда №1 && команда №2 .... && команда №N
Регулярные выражения
Регулярное выражение или RegExp представляет собой произвольный набор символов, определяющих шаблон поиска. Поиск может производиться в файле или в другом выражении. Кроме поиска, их можно применять для проверки условий при авторизации пользователей системы и других нужд.
Для работы с RegExp существует внешняя команда grep, основным недостатком которой медленное выполнение команд. Поэтому, начиная с версии 3.0, в bash начали поддерживаться устроенные регулярные выражения, такие же, как и во многих языках, работающих в режиме интерпретатора, в частности, в perl. Устроенные выражения обрабатываются в рамках процесса bash и потому выполняются гораздо быстрее, чем внешняя команда grep. Подробную информацию по их синтаксису можно найти в документации bash по regex.
Общий синтаксис конструкции для использования устроенных регулярных выражений выглядит так:
[[ string =~ regex ]]
Если Regex совпало или вошло в строку String, тогда статус выхода будет 0. В противном случае – значение 1. Значение внутреннего выражения, заключенного в скобки можно получить с помощью внутренней переменной bash – $BASH_REMATCH.
Продемонстрируем работу с регулярными выражениями на примере одного сценария. Для этого создадим файл сценария с именем lesson_regex:
$ nano lesson_regex.sh
Добавим наш код:
REGEXP='zoom(boom)c7(.*)' if [[ "mnczoomboomc7netto" =~ $REGEXP ]] then echo "Регулярное выражение найдено в составе строчки!" echo "$BASH_REMATCH" echo "${BASH_REMATCH[1]}" echo "${BASH_REMATCH[2]}" fi
Указанный код сопоставляет выражение REGEXP с строчкой, находящейся в левой части условного оператора if. По результатам сопоставления выводятся суммирующие сообщения.
Сохраним файл и выполним сценарий:
$ bash lesson_regex.sh
Как видим, выражение в составе строчки найдено. Значение переменной $BASH_REMATCH без параметров показывает наше выражение. Эта переменная с параметрами показывает символы, которые находятся в скобках: с параметром 1 – значение boom, с параметром 2 – значение netto.
Следующая статья будет посвящена использованию внешних команд bash для работы с выражениями и выполнения сложных вычислений. Итак, продолжение впереди! Просмотрите наш телеграмм-канал.
Подписывайтесь на наш телеграм-канал https://t.me/freehostua, чтобы быть в курсе новых полезных материалов.
Смотрите наш канал Youtube на https://www.youtube.com/freehostua.
Дата-центр FREEhost.UA предоставляет услуги VPS хостинга на протяжении 15 лет. Мы не только размещаем виртуальные серверы, но и помогаем клиентам в их использовании, чтобы они могли сосредоточиться на своем бизнесе. У Фрихоста есть две локации размещения виртуальных серверов — Украина и Польша. Настроенный сервер предоставляется в течение 5 минут с момента подтверждения заказа. Заказывайте ВПС сервер в Польше или в Украине и получите все преимущества сотрудничества с FREEhost.UA
Дата: 05.05.2023 Автор: Александр Ровник
|
|
Авторам статьи важно Ваше мнение. Будем рады его обсудить с Вами:
comments powered by Disqus