Стаття також доступна російською (перейти до перегляду).
Вступ
У попередніх двох статтях ми обговорили базові поняття та методи використання bash, а також мовні конструкції та змінні, тепер давайте поговоримо про умовні оператори.
Оболонка bash не була б такою ефективною і популярною серед фахівців, якби не мала внутрішніх програмних засобів для створення доволі складних сценаріїв, котрі відповідають всім вимогам структурного програмування. Одним із таких засобів є оператори розгалуження. У bash вони мають деякі особливості. Поговоримо про це та перевіримо їх роботу на практиці.
Огляд управляючих конструкцій Bash для обробки даних
Bash є командним процесором із широкими можливостями для імперативного програмування, коли програми будуються у формі послідовного списку наказів або команд для інтерпретатора. Так само, як і для більшості імперативних мов програмування (C, C++, Java) у 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 з відповідним параметром. Введемо у терміналі:
$ 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 Автор: Олександр Ровник
|
|
Рекомендовані статті на тему:
- Как обновить FreeBSD с 12 до 13
- Атака с помощью сервера времени NTP на Вашем сервере.
- Зовнішні команди bash для роботи з виразами та виконання складних обчислень
- Команда top - учимся наблюдать за процессами в Linux
- Virtual Network Computing (VNC) — система удалённого доступа. Описание, установка, особенности
Авторам статті важлива Ваша думка. Будемо раді його обговорити з Вами:
comments powered by Disqus