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

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

Зовнішні команди bash для роботи з виразами та виконання складних обчислень

Вступ

Будь-яка мова програмування чи командний процесор повинні мати достатній набір програмних засобів для роботи з різними типами виразів та виконання складних обчислень. Внутрішні команди, зазвичай, є компактними і їх набір обмежений. І тому, виходом із ситуації є використання, так званих, зовнішніх або додаткових команд, котрі здатні реалізувати будь-яке завдання, яке є надто складним для базового набору. І командний процесор bash не є винятком. Розглянемо найбільш вживані зовнішні команди bash та протестуємо їх можливості на практиці.

Попередні статті за темою:

Огляд зовнішніх команд bash для роботи з виразами

Серед зовнішніх команд bash можна виділити ті, котрі розраховані на роботу із широким спектром виразів, і тому є універсальними. Інші є більш спеціалізованими і застосовуються лише для певних типів виразів або окремих операцій.

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

До спеціалізованого засобу по роботі із регулярними виразами відноситься програма grep. Її застосування дозволяє розширити межі обробки регулярних виразів порівняно із внутрішнім механізмом regex, обробка котрого здійснюється у рамках процесу bash.

Для виконання складних математичних операцій існує додатковий набір спеціалізованих зовнішніх програм, таких, наприклад, як jot, bc, factor. Вони дозволяють виконувати специфічні завдання, наприклад, вивід числових значень у певній послідовності, як у jot, чи розрахувати значення числових коефіцієнтів, як у factor.

Кожен із наведених програмних засобів має свій власний синтаксис та правила застосування. Їх знання допоможе зорієнтуватися у командному середовищі у разі необхідності вирішення певного завдання. І тому, розглянемо більш детально роботу з ними.

Робота з програмою Expr

 Як вже зазначалося, програма працює зі всіма типами виразів і є універсальною. Її застосування, як правило, не викликає складнощів, тим паче, що вона вже присутня у більшості дистрибутивів Linux і доступна для встановлення з репозиторію. Скористаємося можливостями термінальної роботи з нашою системою Ubuntu 20.0 та протестуємо програму expr.

Насамперед, переглянемо опис її синтаксичних конструкцій за допомогою довідкової системи. Для цього введемо у терміналі наступну команду:

$ expr --help

Перегляд довідки по програмі Expr

Як можна переконатися, засіб здатний виконувати математичні операції та логіку, здійснювати порівняння аргументів та використовувати шаблони пошуку для регулярних виразів.

Загальний синтаксис оператора для операції складання буде наступним:

expr арг1 + арг2

Введемо наступну команду у терміналі:

$ expr 25 + 5

Синтаксис суми в Expr

Команда одразу ж видає результат, у даному випадку дорівнює числу 30.

Загальний синтаксис оператора для операції віднімання буде таким:

expr арг1 - арг2

Введемо для перевірки:

$ expr 35 - 15

приклад операції віднімання

Отже, результат операції вірний.

Синтаксис оператора для операції множення:

expr арг1 \* арг2

Перевіримо це:

$ expr 20 \* 3

приклад операції множення в Expr

Результат вірний, це число 60.

Синтаксис оператора для операції ділення:

expr арг1 / арг2

Введемо у терміналі:

$ expr 21 / 3

Операція ділення в Expr

Все вірно.

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

$ count_var1=0
$ count_var1=`expr $count_var1 + 1`
$ echo $count_var1

Використання інкременної змінної в Expr

Тут ми спочатку присвоїли нульове значення змінній coun_var1, а потім за допомогою оператора expr збільшили її значення на 1. Цей механізм можна застосовувати у подальшому при організації обробки даних у сценаріях.

Синтаксис оператора для операції порівняння аргументів є наступним:

expr арг1 \> арг2

Результатом роботи буде значення 1, якщо перший аргумент більше другого, і 0, якщо не більше.

Перевіримо працездатність конструкції:

$ expr 15 \> 9

Операція порівнняння аргументів в Expr

Отримали значення 1, як і повинно бути.

Тепер введемо інші числа:

$ expr 6 \> 9

Операція порівняння аргументів в Expr

Отримали нульовий результат, тобто, все вірно, оскільки число 6 не може бути більшим за число 9.

Для визначення рівності аргументів застосовується наступна конструкція:

expr арг1 /= арг2

Якщо аргументи мають однакові значення, то результатом буде значення 1, у протилежному випадку – 0.

Введемо у терміналі:

$ expr 7 \= 12

Визначення рівності аргументів в Expr

Повернуто 0, оскільки числа не співпадають.

Змінимо числа у команді:

$ expr 7 \= 7

Визанчення рівності аргументів в Expr

Результатом є значення 1, тому що числа однакові.

Продемонструємо синтаксис і роботу розглянутих та інших конструкцій програми expr безпосередньо у сценарії. Для цього створимо файл сценарію із ім'ям lesson_expr та введемо в нього наведений нижче код:

$ nano lesson_expr.sh

Код сценарію:

#!/bin/bash

len=Windows7

read -p "Будь ласка уведіть перше число: " n1
read -p "Будь ласка уведіть друге число: " n2

rezult1=`expr $n1 + $n2`
rezult2=`expr $n1 \= $n2`
rezult3=`expr $n1 \< $n2`
rezult4=`expr $n1 \| $n2`
rezult5=`expr length $len`

echo  "Сума двох чисел: $rezult1"
echo  "Перевірка чи рівні два числа: $rezult2"
echo  "Перевірка чи менше перше число ніж друге: $rezult3"
echo  "Перевірка чи є якесь із виразів істинним: $rezult4"
echo  "Довжина строки є: $rezult5"

Код файлу lesson_expr.sh

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

Сутність роботи наведеного коду полягає у обробці різними способами введених користувачем двох чисел, а також у виконанні операції зі строковим виразом. Строкове значення Windows7 присвоєне змінній $len. Expr підраховує кількість символів у вказаному строковому значенні. Результати роботи всіх конструкцій фіксуються у змінних із назвою $rezultN, де N – номер операції. Потім значення вказаних змінних виводяться на екран за допомогою оператора echo.

Запустимо сценарій на виконання:

$ bash lesson_expr.sh

Запуск файлу lesson_expr.sh

Можна переконатися, що результати всіх операцій є вірними.

Команда Jot

Засіб дозволяє створювати довільні списки чисел на основі вказаних значень початкового (базового) числа та кількості чисел, котрі виводяться у списку.

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

$ sudo apt install athena-jot

Встановлення jot

Отже, програма athena-jot успішно встановлена у системі.

Розглянемо способи її використання та синтаксис. Перший варіант використання – це вивід заданої кількості чисел після базового числа. У цьому разі синтаксис конструкції буде виглядати наступним чином:

jot m n

Де n – базове число; m – кількість чисел, котрі будуть виведені після числа n.

Наведемо конкретний приклад. Введемо у терміналі:

$ jot 5 10

Вивід 5 числе починаючи з числа 10

Тут число 5 – це кількість чисел, що виводяться, а 10 – базове число. За результатами роботи виведені значення з 10 до 14, тобто, саме базове число також включається у загальний список.

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

jot  m n o

Де n – базове число; m – кількість чисел, що передує числу n; o – значення числа, до котрого можна виводити список чисел.

Наведемо приклад:

$ jot 9 10 3

Вивід чисел від 10 до 3

Можна переконатися, що числа виведені у зворотному порядку, починаючи з базового. І вивід зупинено на числі 3.

Команди Factor та Bc

Програма factor використовується для розрахунку значень коефіцієнтів вказаного у команді числа.

Синтаксис наступний:

factor number

Наведемо приклад:

$ factor 14

Розрахунок коефіціентів числа 14

Як бачимо, коефіцієнти числа 14 розраховані вірно.

Програма bc корисна у випадку необхідності швидкого виконання складних обчислень у bash. Вона може розраховувати значення тригонометричних функцій, отримувати квадратний корінь числа та обробляти логічні вирази. Таке різноманіття можливостей та швидкість роботи робить її дуже зручною при застосуванні у командній строчці і у сценаріях.

Загальний синтаксис має наступний вигляд:

echo "math_expr" | bc

Де math_expr – будь-який математичний вираз, котрий підлягає миттєвому розрахунку.

Наведемо приклад. Введемо у терміналі:

$ echo "25/2+10*3" | bc

Математичний розрахунок за допомогою команди bc

Можна переконатися, що значення вказаного у конструкції виразу розраховано вірно.

Команда Grep

Засіб призначений для організації роботи із регулярними виразами, котрі є наборами символів, що задають шаблон пошуку даних. Програму можна використовувати для пошуку та заміни даних, для перевірки умов при вході та інших важливих цілей.

Загальний синтаксис програми виглядає так:

grep ххх file

Де ххх – шаблон для пошуку у форматі regex, file – повна назва файлу, у котрому необхідно виконати пошук чи заміну даних.

Для можливості демонстрації роботи із засобом та для виконання повноцінних запитів, створимо файл із ім'ям test_grep, у котрий введемо наступний текст (скорочений варіант):

Counting the number of lines in terminal output is a simple yet useful task that can help us in many .................................... will explore various ways to count the number of lines in terminal output.

Викличемо редактор nano

$ nano test_grep

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

Збережемо внесені зміни та закриємо файл.

Тепер будемо застосовувати певні формати шаблонів для пошуку потрібних даних.

Введемо у терміналі:

$ grep "l...s" test_grep

Пошщук послідовності симовлів через grep

Ключовим елементом виразу є символ «.», котрим позначається відсутній у текстовій строчці символ. У даному випадку, будуть шукатися послідовності символів, котрі починаються з букви «l», посередині можуть мати три будь-яких символи і закінчуються буквою «s». Результат роботи конструкції показаний вище. Як видно зі скриншоту, виділяються послідовності не тільки у межах одного слова, але й з різних слів, котрі знаходяться поруч. Також добре видно, що символом «.» позначаються не тільки існуючі букви, але й пусті символи.

Тепер використаємо наступний шаблон пошуку:

$ grep "C[oui]g" test_grep

Пошук слів з вказаною комбінацією всередині слова

Ключовим елементом тут є квадратні дужки []. Ними позначаються діапазони позицій символів у шаблонах. У нашому випадку, буде відбуватися пошук всіх послідовностей символів, котрі починаються з символу «С», закінчуються символом «g» та можуть мати посередині комбінацію лише з трьох латинських букв: o, u та i. Тобто, ці символи є допустимими, а всі інші – ні.

Розглянемо наступний пошуковий шаблон:

$ grep "Mb[^1-6]v" test_grep

Пошук слів у файлі із заданою комбінацією

Ключовим елементом тут є квадратні дужки із спеціальним символом у середині: [^]. Сутність його використання полягає у пошуку будь-яких знаків, окрім тих, що вказані у дужках. У нашому випадку, будуть шукатися послідовності, котрі починаються із «Mb», закінчуються буквою «v», а посередині допустимі всі символи, окрім цифр від 1 до 6.

$ grep "tek*" test_grep

Пошук слова яке починається на te

Ключовим елементом тут є знак «*», котрим позначається будь-яка кількість входжень букви «k», включаючи її відсутність. Як видно з результатів, таким вимогам відповідають лише послідовності виду «te».

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

Підписуйтесь на наш телеграм-канал https://t.me/freehostua, щоб бути в курсі нових корисних матеріалів.

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

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

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

Дата: 18.05.2023
Автор: Євген
Голосування

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

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