Стаття також доступна російською (перейти до перегляду).
Вступ
У попередніх статтях ми розглянули основні концепції використання 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