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

Вступ
У попередній статті ми обговорили базові поняття роботи з Bash-скриптами. Тепер давайте детальніше поговоримо про мовні конструкції та змінні в Bash.
Можливості bash дозволяють контролювати стан програмного середовища, створювати сценарії та управляти їх виконанням. Усе це стає можливим, зокрема, завдяки підтримці внутрішніх та зовнішніх змінних, наявності спеціальних конструкцій та операторів. Кожен з елементів вказаного арсеналу має свій власний синтаксис та правила використання. Розглянемо їх та перевіримо в дії.
Змінні
У bash відсутні типи даних. Всі змінні, котрі використовуються можна розділити на внутрішні або влаштовані у оболонку, та зовнішні, котрі створюються користувачем для різних задач. І, хоча вони мають різне походження та призначення, принцип їх використання однаковий. Ознакою змінної є наявність символу «$» попереду її назви. Будь-яка змінна може зберігати числові значення, окремі символи або рядки символів. Розглянемо правила та приклади використання обох видів змінних.
Внутрішні змінні
Внутрішні змінні зберігають значення системних параметрів, необхідних для налаштування потрібної конфігурації середовища та отримання системної інформації. Приклади найбільш вживаних змінних:
- $BASH_VERSION – зберігає версію оболонки;
- $HOME – домашній каталог користувача;
- $GROUPS – назви груп, до котрих належить поточний користувач;
- $HOSTTYPE – ідентифікація апаратної архітектури машини;
- $PS1 – запрошення командного рядка;
- $PATH – шлях пошуку виконавчих файлів, котрий використовується оболонкою;
- $PPID – ідентифікатор батьківського процесу;
- $PWD – поточний каталог;
- $SECONDS – час роботи сценарію.
Розглянемо використання декотрих з них. Для прикладу, однією з найважливіших є змінна $PATH. Її використання підвищує гнучкість та безпечність Linux-систем. Вона слугує для вказівки bash де шукати виконавчі файли. Зазвичай, такі файли знаходяться у каталогах /bin, котрих може бути кілька в різних місцях. Це дозволяє не вказувати повний шлях до програми у командному рядку, а лише її назву. Значення змінної завантажується до пам'яті при завантаженні файлів конфігурації оболонки. Таких файлів є кілька, але який з них «прочитається» оболонкою залежить від того, яким чином була проведена реєстрація в системі. Ось ці файли:
/etc/bash.bashrc – глобальний файл сценарію конфігурації оболонки;
~ /.bashrc – персональний файл конфігурації;
~ /.bash_profile – файл ініціалізації користувача;
/etc/profile – глобальний файл ініціалізації.
Переглянемо існуюче на даний час значення вказаної змінної. Для цього введемо у терміналі:
$ echo $PATH

Ми бачимо директорії, налаштовані в $PATH по замовченню. Всі вони перераховані через двокрапку. Існує ще один спосіб переглянути значення вказаної змінної:
$ printenv PATH

Як бачимо, результат однаковий. Ще один спосіб дізнатися шлях до виконавчого файлу програми, це використання спеціальної команди which разом із потрібною програмою. Введемо у терміналі:
$ which whoami

Ми отримали шлях до місцезнаходження виконавчих файлів програми whoami
Можна тимчасово додати каталог у $PATH. Це значення буде діяти лише на час роботи поточного сеансу терміналу. При закритті терміналу каталог автоматично видаляється. Для додавання нового каталогу використовуємо команду export:
$ export PATH="/NewDirectory:$PATH"

Перевіримо поточне значення змінної:
$ echo $PATH

Отже, новий каталог додано.
Можна додати новий каталог, відредагувавши вказані вище файли конфігурації за допомогою одного з редакторів тексту, наприклад, nano. Для того, щоб додати новий каталог лише для поточного користувача системи, необхідно відредагувати персональний файл конфігурації. Введемо у терміналі:
$ nano .bashrc


Збережемо внесені зміни та вийдемо з редактора (ctrl+O, ctrl+X). Для того, щоб зміни негайно почали діяти, необхідно перезавантажити вказаний файл:
$ source .bashrc

Після цього внесені зміни вступили в силу.
Якщо ж ми хочемо додати каталог для всіх користувачів системи, то тоді необхідно відредагувати глобальний файл ініціалізації /etc/profile.
Так само ми можемо переглядати й змінювати значення інших внутрішніх змінних оболонки. Для прикладу, розглянемо тип апаратної архітектури нашого сервера:
$ echo $HOSTTYPE

Результат – x86_64. Взагалі ж, якщо нам потрібно переглянути значення всіх змінних програмного середовища, то можна скористатися командою printenv:
$ printenv

Як бачимо, значення одразу кількох внутрішніх змінних виведені на термінал.
Зовнішні змінні
Зовнішні змінні створюються користувачем в основному для їх використання у сценаріях. Для їх коректного використання треба притримуватись встановлених домовленостей, стосовно імен змінних:
- Імена повинні починатися з букви або символу підкреслення;
- У складі імені можуть бути тільки букви, цифри та символи підкреслення;
- Враховується регістр символів;
- Використання пробілів та спец символів заборонено;
- Не можна використовувати зарезервовані системою слова, котрі використовуються для назв мовних конструкцій та системних змінних.
Для прикладу, наведемо коректні назви змінних:
Gora_
_fazan
mmm
Некоректні назви:
Ind-us (використовується заборонений символ «-»)
12345r (назва починається з цифри)
gh hhd (присутній пробіл у середині назви)
Присвоїти значення, тобто, по суті, створити нову змінну можна двома шляхами – пряме присвоєння та присвоєння результатів роботи команди або програми шляхом підстановки.
Приклад прямого присвоєння:
town=Buenos_Aires
Приклад підстановки:
new_town=$town
Тут значення змінної $town передалося новій змінній $new_town. Продемонструємо це в терміналі:

Звертаємо увагу на те, що пробіли між змінними та їх значеннями недопустимі. Наприклад, спробуємо присвоїти значення, тобто, створити змінну з використанням пробілів у команді:
town = Buenos_Aires

Як бачимо, інтерпретатор bash сприймає «town» як команду, а оскільки такої команди не існує, то він виводить повідомлення, що така команда не знайдена. Отже, це треба враховувати у подальшому.
Конструкції для введення, виведення та перенаправлення даних
Введення даних
Розглянемо спочатку конструкції для вводу. Ввід даних може бути здійснений з кількох джерел:
- З клавіатури користувачем (користувацький);
- З файлу;
- За рахунок використання аргументів командного рядка.
Користувацький ввід даних є можливим завдяки наявності оператора read. Продемонструємо це. Наберемо у терміналі:
$ echo "На якому курсі університету Ви навчаєтесь?" $ read kurs

Результат введення двох команд можна побачити на скриншоті. Система очікує введення даних від користувача. Після їх введення та підтвердження вводу клавішею Enter результат буде наступним:

Тобто, команда автоматично вивела результат. Перевіримо, чи збереглося значення змінної $kurs у пам'яті. Для цього введемо команду виводу:
$ echo $kurs

Так, значення збереглося. Це означає, що такі змінні можна використовувати в сценаріях. Сформуємо сценарій із використаних нами команд. Для цього викличемо редактор та введемо в нього наступні рядки:
#!/bin/bash echo "На якому курсі університету Ви навчаєтесь?" read kurs echo "Зрозуміло, значить Ви навчаєтесь на $kurs курсі" $ nano lesson_1.sh

Збережемо файл та запустимо його на виконання:
$ bash lesson_1.sh
Після запуску сценарію з'являється прохання ввести дані та система знаходиться у режимі очікування вводу:

Кінцевий результат роботи сценарію показаний нижче.

Можна переконатися, що змінна $kurs, яка була вставлена в останный рядок, успішно спрацювала.
Зчитування даних з файлу застосовується при необхідності вивести результати на термінал або ж у інший файл чи пристрій. Для цієї мети існує спеціальна конструкція «<». Застосуємо цю конструкцію у нашому новому сценарію, який призначений для виводу на термінал кожного рядку файлу із ім'ям text.txt. Викличемо редактор та вставимо в нього код, наведений нижче:
#!/bin/bash while read newline do echo $newline done < text.txt $ nano lesson_2.sh

Збережемо внесені зміни та закриємо файл сценарію. Після цього запустимо його на виконання
$ bash lesson_2.sh

У результаті, кожен рядок текстового файлу виведений на термінал, як і планувалося.
Аргументи командного рядка є ще одним вдалим способом роботи зі змінними. Сутність його полягає у послідовній нумерації переданих скрипту або функції параметрів або змінних. Завдяки цьому, такі змінні можна легко ідентифікувати у межах коду. Це виглядає так:
$1, $2, $3 .... $N
Для прикладу, створимо новий файл сценарію із ім'ям lesson_3 та помістимо в нього наступний код:
#!/bin/bash echo "Сьогодні у нас буде заняття на тему $1" echo "Завтра у нас буде заняття на тему $2" echo "Післязавтра у нас буде заняття на тему $3" $ nano lesson_3.sh

Збережемо внесені зміни та закриємо файл. Після цього запустимо створений скрипт на виконання з передачею трьох параметрів, як показано нижче:
$ bash lesson_3.sh Php C++ JavaScript

Як видно зі скриншоту, всі параметри були успішно передані та ідентифіковані, тобто, метод аргументів працює.
Виведення даних
Виведення на термінал можна забезпечити за допомогою команди echo, роботу з котрою ми вже не раз демонстрували.
Для виводу або запису інформації у файл у bash застосовується конструкція «>», котра є дзеркальним відображенням конструкції для вводу. Для прикладу, запишемо текстову інформацію у файл text2.txt. Введемо у терміналі:
$ echo "Текст для запису в файл." > text2.txt

Тепер перевіримо вміст файлу за допомогою команди cat (виведення вмісту файлу):
$ cat text2.txt

Можна переконатися, що запис інформації відбувся успішно.
Інформацію можна також додати у кінець будь-якого файлу. Для цього існує конструкція «>>». Скористаємося нею та додамо додаткові дані до нашого файлу. Введемо:
$ echo "Додатковий текст для запису в файл." >> text2.txt

Знову перевіримо вміст файлу:
$ cat text2.txt

Як бачимо, текст успішно додався у кінець існуючих записів.
Ще один спосіб виводу інформації – це її пере направлення. Для прикладу, пере направимо результати виконання команди у визначений файл. Введемо у терміналі:
$ ls > ls_info.txt

Зробимо перевірку:
$ cat ls_info.txt

Можна переконатися в успішності виконаної операції.
Наступного разу ми поговоримо про умовні оператори, цикли та інші інструменти bash, котрі дозволяють їй бути гнучкою та ефективною. Слідкуйте за нашим телеграм каналом.
Дата-центр FREEhost.UA надає послуги з оренди серверного обладнання в Україні з 2003 року. У нас Ви можете підібрати сервер під різні завдання, з вартістю від 700 грн. на місяць. Наші фахівці готові допомогти в обслуговуванні обладнання та налаштуванні програмного забезпечення. Переходьте на сторінку зі списком конфігурацій і обирайте, найбільш підходящий для Вас варіант.
Дивіться наш канал Youtube на https://www.youtube.com/freehostua.
Ми у чомусь помилилися, чи щось пропустили?
Напишіть про це у коментарях, ми з задоволенням відповімо та обговорюємо Ваші зауваження та пропозиції.
|
Дата: 04.04.2023 Автор: Олександр Ровник
|
|

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