• База знань
  • /
  • Блог
  • /
  • Wiki
  • /
  • ONLINE CHAT
+380 (44) 364 05 71

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

Організація обробки даних в сценаріях Bash

Вступ

У попередніх двох статтях ми обговорили базові поняття та методи використання 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

Виклик довідки в bash

Перелік параметрів та операторів

Для прикладу, створимо сценарій із ім'ям 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

Редагування файлу lesson_if

Збережемо внесені зміни (ctrl+O, Enter) та вийдемо з редактору (ctrl+X).

Тепер запустимо на виконання створений сценарій. Для цього введемо у терміналі:

$ bash lesson_if.sh

Запуск на виконання файлу 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

Редагування файлу lesson_case.sh

Збережемо файл (ctrl+O, Enter) та вийдемо з редактору (ctrl+X).

Після цього запустимо на виконання наш сценарій. Введемо у терміналі:

$ bash lesson_case.sh

Запуск на виконання файлу lesson_case.sh

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

Результат виконання сценарію

Тобто, мова вказаної у запиті сценарію країни визначена вірно.

У наступній статті поговоримо про ще одну управляючу конструкцію bash – цикли та все, що з ними пов'язано. А також розглянемо сумісну роботу умовних операторів та циклів. Слідкуйте за нашим телеграм-каналом.

Якщо Вам потрібен надійний віртуальний сервер з локацією в Україні або Польщі, дата-центр FREEhost.UA може його надати Вам за лічені хвилини після оплати. Широкий вибір шаблонів для автоматичного налаштування сервера, цілодобова технічна підтримка, високий Uptime, безкоштовні бекапи, гарантовані виділені ресурси, це лише частина переваг нашого сервісу.

Дивіться наш канал Youtube на https://www.youtube.com/freehostua.

Ми у чомусь помилилися, чи щось пропустили?

Напишіть про це у коментарях, ми з задоволенням відповімо та обговорюємо Ваші зауваження та пропозиції.

Дата: 13.04.2023
Автор: Олександр Ровник
Голосування

Авторам статті важлива Ваша думка. Будемо раді його обговорити з Вами:

comments powered by Disqus
navigate
go
exit
Дякуємо, що обираєте FREEhost.UA