Обробка даних у Bash: арифметика та робота зі строками (Частина 3)

11.01.2026 3 хвилин Автор: Lady Liberty

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

Арифметичні операції в Bash-скриптах

Просте пояснення того, як у Bash виконувати додавання, віднімання, множення та ділення під час написання скриптів.

Давайте трохи математики в Bash

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

У цьому розділі серії для початківців з Bash розглядається, як використовувати арифметичні оператори для виконання різних обчислень безпосередньо в скриптах.

Щоб освіжити в пам’яті, нижче наведено арифметичні оператори, які підтримує Bash:

Виконання додавання та віднімання в Bash-скриптах

Створимо Bash-скрипт з назвою addition.sh, який просто додає розміри двох файлів у байтах і виводить результат на екран.

На цьому етапі аргументи в Bash-скриптах уже мають бути знайомі. Так само варто знати команди cut і du, оскільки без них приклад не буде повним.

Команда du показує розмір файлу разом із його назвою. У виводі містяться одразу два значення, тому тут використовується команда cut, щоб отримати лише перший стовпець, тобто сам розмір файлу. Вивід команди du передається в cut за допомогою конвеєра pipe.

Нижче наведено сам скрипт:

#!/bin/bash

fs1=$(du -b $1 | cut -f1)
fs2=$(du -b $2 | cut -f1)

echo "File size of $1 is: $fs1"
echo "File size of $2 is: $fs2"

total=$(($fs1 + $fs2))

echo "Total size is: $total"

Зверніть увагу, що імена двох файлів передаються скрипту як аргументи. Наприклад, у цьому випадку скрипт запускається з передачею файлів /etc/passwd та /etc/group як аргументів:

kabary@handbook:~/scripts$ ./addition.sh /etc/passwd /etc/group
File size of /etc/passwd is: 2795
File size of /etc/group is: 1065
Total size is: 3860

Найважливішим рядком у скрипті addition.sh є:

total=$(($fs1 + $fs2))

Тут використовується оператор +, щоб додати два числа $fs1 і $fs2. Також варто звернути увагу, що для обчислення будь-якого арифметичного виразу його потрібно помістити в подвійні круглі дужки у такому вигляді:

$((arithmetic-expression))

Так само можна використовувати оператор мінус - для віднімання. Наприклад, у наведеному нижче виразі змінна sub матиме значення сім:

sub=$((10-3))

Виконання множення та ділення в Bash-скриптах

Створимо Bash-скрипт з назвою giga2mega.sh, який конвертує гігабайти (GB) у мегабайти (MB):

#!/bin/bash

GIGA=$1
MEGA=$(($GIGA * 1024))

echo "$GIGA GB is equal to $MEGA MB"

Тепер запустимо скрипт і подивимося, скільки мегабайт міститься в чотирьох гігабайтах:

kabary@handbook:~/scripts$ ./giga2mega.sh 4
4 GB is equal to 4096 MB

Тут використовується оператор множення *, щоб помножити кількість гігабайтів на 1024 і отримати відповідне значення в мегабайтах:

MEGA=$(($GIGA * 1024))

До цього скрипта легко додати додаткову функціональність і конвертувати гігабайти (GB) у кілобайти (KB):

KILO=$(($GIGA * 1024 * 1024))

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

Також у Bash доступний оператор ділення /, який дозволяє ділити два числа. Наприклад, у наведеному нижче виразі змінна div матиме значення п’ять:

div=$((20 / 4))

Зверніть увагу, що це цілочисельне ділення, тому дробова частина просто відкидається. Наприклад, якщо поділити 5 на 2, вийде 2, хоча очевидно, що це не точний результат:

kabary@handbook:~/scripts$ div=$((5 / 2))
kabary@handbook:~/scripts$ echo $div
2

Щоб отримати результат із десятковою частиною, можна скористатися командою bc. Наприклад, для ділення 5 на 2 за допомогою bc використовується такий вираз:

echo "5/2" | bc -l
2.50000000000000000000

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

Використання піднесення до степеня та остачі від ділення (modulo)

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

#!/bin/bash
a=$1
b=$2
result=$((a**b))
echo "$1^$2=$result"

Зверніть увагу, що для обчислення використовується оператор піднесення до степеня **, який дозволяє знайти результат піднесення числа a до степеня b.

Запустимо скрипт кілька разів, щоб переконатися, що він повертає правильні результати:

kabary@handbook:~/scripts$ ./power.sh 2 3
2^3=8
kabary@handbook:~/scripts$ ./power.sh 3 2
3^2=9
kabary@handbook:~/scripts$ ./power.sh 5 2
5^2=25
kabary@handbook:~/scripts$ ./power.sh 4 2
4^2=16

Також можна використовувати оператор остачі від ділення %, щоб знаходити цілу остачу. Наприклад, у наведеному нижче виразі змінна rem матиме значення 2:

rem=$((17%5))

Остача тут дорівнює 2, оскільки число 5 поміщається в 17 три рази, і ще дві одиниці залишаються.

Час для практики: створюємо конвертер температур у Bash

Завершимо цей урок створенням скрипта з назвою c2f.sh, який конвертуватиме градуси Цельсія у градуси Фаренгейта за формулою, наведеною нижче:

F = C x (9/5) + 32

Це буде гарною практичною вправою, щоб закріпити нові можливості, з якими щойно вдалося познайомитися в цьому уроці з Bash.

Нижче наведено один із можливих варіантів розв’язання, хоча таких рішень може бути кілька:

#!/bin/bash

C=$1
F=$(echo "scale=2; $C * (9/5) + 32" | bc -l)

echo "$C degrees Celsius is equal to $F degrees Fahrenheit."

Використовується команда bc, оскільки тут маємо справу з дробовими числами. Також застосовано параметр scale=2, щоб виводити результат із двома знаками після коми.

Запустимо скрипт кілька разів, щоб переконатися, що він коректно виводить результати:

kabary@handbook:~/scripts$ ./c2f.sh 2
2 degrees Celsius is equal to 35.60 degrees Fahrenheit.
kabary@handbook:~/scripts$ ./c2f.sh -3
-3 degrees Celsius is equal to 26.60 degrees Fahrenheit.
kabary@handbook:~/scripts$ ./c2f.sh 27
27 degrees Celsius is equal to 80.60 degrees Fahrenheit.

Чудово, з цим розібралися, рухаємося далі.

Операції зі строками в Bash

Час попрацювати зі строками та розібратися, як обробляти текст у Bash-скриптах.

Попрацюймо зі строками

Якщо робота зі змінними в Bash уже знайома, то відомо, що тут немає окремих типів даних для рядків, чисел тощо. Усе є змінними.

Але це зовсім не означає, що можливостей для роботи зі строками немає.

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

Отримання довжини строки

Почнемо з того, як дізнатися довжину строки в Bash.

Строка це звичайна послідовність символів. Створимо строку з назвою distro та задамо їй значення Ubuntu.

distro="Ubuntu"

Щоб дізнатися довжину строки distro, достатньо додати символ # перед назвою змінної. Для цього можна скористатися такою командою echo:

kabary@handbook:~/scripts$ echo ${#distro}
6

Зверніть увагу, що команда echo використовується лише для виведення значення. Саме конструкція ${#string} повертає довжину строки.

Об’єднання двох строк

До однієї строки можна додати іншу в кінці. Така операція називається об’єднанням строк або конкатенацією.

Для прикладу спочатку створимо дві строки str1 і str2 таким чином:

str1="hand"
str2="book"

Тепер можна об’єднати обидві строки та присвоїти результат новій змінній з назвою str3 таким чином:

str3=$str1$str2

Простіше вже й не вигадаєш, чи не так?

Пошук підрядків

У строці можна знайти позицію (індекс) певної літери або слова. Для прикладу спочатку створимо строку з назвою str таким чином:

str="Bash is Cool"

Тепер можна визначити конкретну позицію (індекс) підрядка cool. Для цього використовується команда expr:

kabary@handbook:~/scripts$ word="Cool"
kabary@handbook:~/scripts$ expr index "$str" "$word"
9

Результат 9 означає позицію, з якої слово Cool починається у строці str.

У цьому прикладі навмисно не використовуються умовні конструкції на кшталт if або else, оскільки в цій серії уроків для початківців з Bash умовні оператори розглядатимуться пізніше.

Витягування підрядків

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

Для прикладу спочатку створимо строку з назвою foss таким чином:

foss="Fedora is a free operating system"

Тепер уявімо, що потрібно витягнути перше слово Fedora зі строки foss. Для цього слід указати початкову позицію (індекс) потрібного підрядка та кількість символів, які необхідно отримати.

Отже, щоб витягнути підрядок Fedora, як початкову позицію використовується значення 0, а зі строки беруться 6 символів, починаючи з цієї позиції:

kabary@handbook:~/scripts$ echo ${foss:0:6}
Fedora

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

Наприклад, щоб отримати підрядок free operating system зі строки foss, достатньо вказати лише початкову позицію 12:

kabary@handbook:~/scripts$ echo ${foss:12}
free operating system

Заміна підрядків

У строці можна замінювати один підрядок іншим. Наприклад, слово Fedora у строці foss можна замінити на Ubuntu таким чином:

kabary@handbook:~/scripts$ echo ${foss/Fedora/Ubuntu}
Ubuntu is a free operating system

Розгляньмо ще один приклад. Замінімо підрядок free на popular:

kabary@handbook:~/scripts$ echo ${foss/free/popular}
Fedora is a popular operating system

Оскільки команда echo лише виводить значення, початкова строка насправді не змінюється.

Видалення підрядків

Із строки також можна видаляти підрядки. Для прикладу спочатку створимо строку з назвою fact таким чином:

fact="Sun is a big star"

Тепер можна видалити підрядок big зі строки fact таким чином:

kabary@handbook:~/scripts$ echo ${fact/big}
Sun is a star

Створімо ще одну строку з назвою cell:

cell="112-358-1321"

Тепер уявімо, що потрібно видалити всі дефіси зі строки cell. Наведений нижче вираз видалить лише перше входження дефіса у строці cell:

kabary@handbook:~/scripts$ echo ${cell/-}
112358-1321

Щоб видалити всі входження дефіса зі строки cell, потрібно використати подвійну косу риску // ось таким чином:

kabary@handbook:~/scripts$ echo ${cell//-}
1123581321

Зверніть увагу, що тут використовуються команди echo, тому сама строка cell залишається без змін. Виводиться лише потрібний результат.

Щоб змінити саму строку, потрібно присвоїти отриманий результат назад цій змінній таким чином:

kabary@handbook:~/scripts$ echo $cell
112-358-1321
kabary@handbook:~/scripts$ cell=${cell//-}
kabary@handbook:~/scripts$ echo $cell
1123581321

Перетворення літер у верхній та нижній регістр у строці

Також можна перетворювати строку в нижній або верхній регістр. Для початку створимо дві строки з назвами legend і actor:

legend="john nash"
actor="JULIA ROBERTS"

Можна перетворити всі літери у строці legend на великі таким чином:

kabary@handbook:~/scripts$ echo ${legend^^}
JOHN NASH

Так само можна перетворити всі літери у строці actor на малі таким чином:

kabary@handbook:~/scripts$ echo ${actor,,}
julia roberts

Також можна перетворити лише перший символ у строці legend на велику літеру таким чином:

kabary@handbook:~/scripts$ echo ${legend^}
John nash

Так само можна перетворити лише перший символ у строці actor на малу літеру таким чином:

kabary@handbook:~/scripts$ echo ${actor,}
jULIA ROBERTS

Також можна змінювати окремі символи у строці на великі або малі. Наприклад, у строці legend можна перетворити літери j і n на великі таким чином:

kabary@handbook:~/scripts$ echo ${legend^^[jn]}
JohN Nash

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

Підписатися
Сповістити про
0 Коментарі
Найстаріші
Найновіше Найбільше голосів
Знайшли помилку?
Якщо ви знайшли помилку, зробіть скріншот і надішліть його боту.