bash (скор. від «Bourne-Again shell») — це командна оболонка (або «інтерпретатор командного рядка»), яка використовується за замовчуванням в операційних системах на базі Unix та Linux, створена в 1989 році Брайаном Фоксом з метою вдосконалення командної оболонки sh.
bash дозволяє автоматизувати різні завдання, встановлювати програмне забезпечення, налаштовувати конфігурації для свого робочого оточення та багато іншого. У цій статті ми розглянемо використання декількох основних команд bash, а також розглянемо гайд зі створення bash-скриптів.
Що таке термінал?
Термінал — це програма, яка використовується для взаємодії із шеллом. Це просто інтерфейс до шеллу та інших програм командного рядка, які працюють усередині нього. Ось так виглядає типовий термінал (Konsole) в Debian 11 (оточення робочого столу — KDE Plasma):
Типовий термінал в Linux
Кожен раз, коли ми відкриваємо вікно терміналу, ми бачимо запрошення шеллу — ім'я_користувача@ім'я_системи:~$
. Символ $
означає, що ми працюємо під обліковим записом звичайного користувача, а символ ~
(тильда) означає, що в даний момент ми знаходимося в домашньому каталозі /home/<ім’я_користувача>.
Команди bash
Команда bash — це найменша одиниця коду, яку bash може виконати. За допомогою команд ми повідомляємо шеллу, що нам потрібно, щоб він зробив. bash зазвичай приймає від користувача одну команду та повертається до нього після того, як команда буде виконана. Щоб трохи освоїтися в bash, спробуємо виконати кілька простих команд.
Команда echo — повертає все, що ви вводите в командному рядку:
Приклад використання команди echo
Команда date — відображає поточну дату та час:
Приклад використання команди date
Команда pwd (скор. від «print working directory») — вказує на поточний робочий каталог, в якому команди шелла шукатимуть файли.
Файлова ієрархія в Linux має деревоподібну структуру, тому, щоб дістатися зазначеного каталогу або файлу, потрібно пройти певний шлях, кожен вузол якого відокремлений від інших вузлів символом /
.
Приклад використання команди pwd
Команда ls (скор. від «list») — відображає вміст каталогу. Зазвичай команда ls
починає з перегляду домашнього каталогу. Це означає, що якщо ми просто введемо ls
, то дана команда виведе вміст поточного каталогу, яким в нашому випадку є домашній каталог /home/diego:
Приклад використання команди ls
Команда cd (скор. від «change directory») — змінює поточну директорію на задану користувачем. Розглянемо декілька прикладів використання цієї команди:
cd <директорія>
— змінює поточну директорію на задану. Давайте спробуємо за допомогою команди ls
перейти до кореневого каталогу /
та ознайомимося з його вмістом. Зверніть увагу, що ми також можемо використовувати крапку з комою ;
для запису двох команд в одному рядку.
Приклад об’єднання двох команд в одному рядку
cd ..
— повернутися в батьківський каталог.
cd
— повернутися в домашній каталог.
Команда mkdir (скор. від «make directory») — створює новий каталог.
Команда mv (скор. від «move») — переміщує один або кілька файлів/каталогів з одного місця до іншого (яке задане користувачем). Для цього потрібно вказати, що ми хочемо перемістити (тобто джерело), і куди ми хочемо перемістити (тобто пункт призначення).
Як приклад давайте створимо новий каталог Ravesli у домашній директорії і перемістимо в нього всі .txt-файли (ну як “всі”, у мене там тільки один файл — Адреса.txt) з /home/diego/Документи/ за допомогою двох вищенаведених команд:
Переміщення файлів за допомогою команди mv
Команда touch — створює нові порожні файли (а також змінює тимчасові мітки в існуючих файлах та каталогах). Ось як ми можемо створити порожній файл під назвою foo.txt у папці Ravesli з домашнього каталогу:
Створення файлу за допомогою команди touch
Команда rm (скор. від «remove») — видаляє файли/каталоги. За замовчуванням, команда rm
НЕ видаляє каталоги, але якщо використовується як rm -r *
всередині вказаного каталогу, то кожний підкаталог та файл всередині заданого каталогу — видаляються.
Давайте видалимо раніше створений файл foo.txt:
Видалення файлу за допомогою команди rm
Команда rmdir (скор. від «remove directory») — видаляє каталоги.
Давайте видалимо створений раніше каталог /home/diego/Ravesli:
Видалення каталогів за допомогою команди rmdir
Команда cat (скор. від «concatenate») — зчитує файл та виводить його вміст. Команда може працювати з декількома файлами, об’єднуючи їх вивід в єдиний потік (звідси і назва). У мене в домашньому каталозі є папка untitled з файлами С++/Qt-проекту, і нижче я використовую команду cat
для перегляду вмісту файлу main.cpp з untitled:
Приклад використання команди cat
Щоб переглянути декілька файлів, вкажіть один за одним (через пробіл) імена потрібних файлів після команди cat
, наприклад:
Перегляд декількох файлів за допомогою команди cat
Команда man (скор. від “manual”) — відображає довідкові сторінки, які є посібником користувача, вбудованим за замовчуванням у деякі дистрибутиви Linux та більшість Unix-систем. Наприклад, команда man bash
відобразить посібник користувача, а команда man ls
відобразить довідку по команді ls
.
Відображення довідкової інформації за допомогою команди man
Редактор nano
nano — це маленький, простий, консольний текстовий редактор *nix-подібних операційних систем, що вперше побачив світ у далекому 1999 році. Для запуску редактора достатньо ввести в терміналі лише одну команду — nano
. Якщо ж потрібно відредагувати якийсь конкретний файл, застосовується команда nanо /<шлях_до_файлу/<ім'я_файлу>
. Відмінною рисою даного редактора є можливість використання “гарячих клавіш”. Наприклад, для збереження поточного документа застосовується комбінація Ctrl+O, для виклику меню пошуку — Ctrl+W, для виходу з редактора — Ctrl+X, а для отримання всього списку доступних клавіш — Ctrl+G.
Гайд по написанню bash-скриптів
Наш шелл є не тільки проміжною ланкою між користувачем та системою, але ще й потужною мовою програмування. Програми, написані мовою шелла, називаються shell-скриптами (або shell-сценаріями) і мають відповідне розширення файлів .sh. Сама мова містить повний набір утиліт і команд, доступних в *nix-системах, а також цикли, умовні оператори, оголошення змінних тощо. Такі скрипти будуть дуже корисними там, де не потрібне використання повноцінних мов програмування, наприклад, в задачах адміністрування операційної системи.
Створення bash-скрипта
Щоб створити новий файл bash-скрипта, відкрийте текстовий файл у будь-якому редакторі і збережіть його з розширенням .sh. Всі подальші експерименти я проводитиму в Debian Linux із застосуванням текстового редактора nano.
Давайте створимо новий файл ravesli.sh:
diego@debian:~$ touch ravesli.sh
diego@debian:~$ ls -l
-rw-r--r-- 1 diego diego 0 мар 9 14:59 ravesli.sh
diego@debian:~$
Щоб виконати файл bash-скрипта, потрібно змінити права доступу до файлу і зробити його виконуваним. Права доступу, як ви знаєте з попередніх уроків, змінюються командою chmod +x <ім'я_файлу>
:
diego@debian:~$ chmod +x ravesli.sh
diego@debian:~$ ls -l
итого 40
drwxr-xr-x 2 diego diego 4096 фев 27 00:23 build-untitled-Desktop-Debug
-rwxr-xr-x 1 diego diego 0 мар 9 14:59 ravesli.sh
Виконання bash-скрипта
Файл bash-скрипта може бути запущений двома способами:
Спосіб №1: bash <ім'я_файлу>
. Щоб виконати скрипт, просто напишіть в терміналі команду bash
, а потіім (через пробіл) ім’я файлу та натисніть Enter.
Спосіб №2: ./<ім'я_файлу>
. Щоб виконати скрипт, введіть команду ./<ім'я_файлу>
та натисність Enter.
Команда echo
Команда echo — це одна з фундаментальних команд bash-скриптів. Її основне призначення полягає у виведенні будь-якої інформації на екран. Давайте відкриємо за допомогою nano (або іншого текстового редактора) файл ravesli.sh і спробуємо застосувати команду echo
для виводу певного тексту в терміналі.
1 2 3 4 |
#!/bin/bash echo "Привет, Ravesli !" echo "Эта команда была выполнена с помощью bash-скрипта" |
Далі натискаємо Ctrl+O для збереження змін і Ctrl+X для виходу з nano.
Примітка: Кожен bash-скрипт завжди повинен починатися з рядка:
1 |
#!/bin/bash |
У цьому рядку після #!
вказується шлях до командної оболонки bash. Якщо у вас bash знаходиться в іншому місці, то за допомогою команди whereis bash
ви можете дізнатися, де саме, і вказати свій шлях.
Запустимо наш файл і побачимо:
diego@debian:~$ ./ravesli.sh
Привет, Ravesli !
Эта команда была выполнена с помощью bash-скрипта
diego@debian:~$
Комантарі
Коментарі — це важлива частина комп’ютерних програм. Ці рядки не виконуються, проте покращують читабельність коду і допомагають зрозуміти його призначення. У файлі bash-скрипта ми можемо додавати однорядкові та багаторядкові коментарі:
однорядкові коментарі починаються з символу #
;
багаторядкові коментарі починаються з одинарної лапки '
, а символ двокрапки :
використовується для додання рядків в коментар.
Давайте розглянемо простий приклад застосування коментарів в bash-скриптах:
1 2 3 4 5 6 7 8 9 10 |
#!/bin/bash # Застосування команди echo # Це однорядковий коментар echo "Всем привет! Это – пример однострочного комментария!" : ' А ось багаторядковий коментар Давайте ще раз застосуємо команду echo ' echo "Bash – крутая штука" |
Результат:
Оголошення та використання змінних
Ви, напевно, пам’ятаєте, що змінні потрібні для зберігання даних. Вони є важливим аспектом будь-якої мови програмування. Використовувати змінні в bash дуже просто — вони оголошуються шляхом написання свого імені. Надалі при зверненні до змінної потрібно просто вказати символ $
разом з нею.
Давайте оголосимо та застосуємо змінну в нашому файлі bash-скрипта:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#!/bin/bash #оголошуємо змінну VAR="Добро пожаловать на Ravesli.com !" #використовуємо змінну echo $VAR #оголошуємо змінну num1 num1=10 #оголошуємо змінну num2 num2=20 #обчислюємо суму та зберігаємо її в змінній num3 num3=$(($num1+$num2)) #виводимо на екран змінну sum echo "Сумма: $num3" |
Результат:
Умовний оператор if
Умовні оператори bash використовуються для прийняття рішень. В умовних операторах обчислюється конкретна умова. Якщо умова істинна (true), виконується перший блок коду. В протилежному випадку (false) виконується другий блок коду.
Ми можемо обчислити одну або кілька умов усередині блоку if за допомогою операторів OR (||
) та AND (&&
). У bash блок if починається з ключового слова if
і закінчується ключовим словом fi
. Якщо задана умова помилкова, то виконується блок else.
Давайте подивимося, як виконуються умовні оператори bash. Ми оголосили змінну, а потім обчислюємо її та приймаємо рішення на основі її значення. При цьому, для перевірки типу “менше, ніж” застосовується запис –lt
, для “більше, ніж” — запис -gt
, а для перевірки на “рівно” — запис -eq
:
1 2 3 4 5 6 7 8 9 10 |
#!/bin/bash #оголошуємо змінну VAR=7 if [ $VAR -lt 10 ]; then echo "Число меньше 10" else echo "Число равно 10" fi |
Результат:
Вивід показує, що Число меньше 10
, тому що значення змінної дорівнює 7, що явно менше 10. У цьому прикладі виконується умова.
Аналогічно, ми можемо використовувати умови OR (||
) та AND (&&
) всередині блоку if для обчислення кількох умов. Давайте розглянемо приклад оператора OR:
1 2 3 4 5 6 7 8 9 10 11 12 |
#!/bin/bash #оголошуємо змінну VAR=7 #використовуємо оператор OR в if-умові if [[ ( $VAR -gt 5 ) || ( $VAR -eq 7 ) ]] then echo "Число больше 5 или равно 7" else echo "Число не больше 5 и не равно 7" fi |
Результат:
Тепер давайте використаємо оператор AND всередині умови if. В операторі AND обидві умови повинні бути істинними.
1 2 3 4 5 6 7 8 9 10 11 12 |
#!/bin/bash #оголошення змінної VAR=7 #використовуємо оператор AND в if-умові if [[ ( $VAR -gt 5 ) && ( $VAR -lt 10 ) ]] then echo "Были выполнены оба условия" else echo "Условия не были выполнены" fi |
Результат:
Оператор else if
Оператор else if використовується для обчислення декількох умов. Для визначення оператора else if використовується ключове слово elif
.
Давайте розглянемо приклад з користувацьким вводом (ключове слово read
використовується для отримання вхідних даних від користувача):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#!/bin/bash echo "Введите число" read num #оголошуємо змінну if [ $num -gt 10 ]; then echo "Число больше 10" elif [ $num -eq 10 ]; then echo "Число равно 10." elif [ $num -lt 10 ]; then echo "Число меньше 10" else echo "Некорректное число" fi |
Результат:
Цикл while
Цикл while використовується для багаторазового виконання коду. Він обчислює умову і продовжує виконання доти, доки умова не стане помилковою. Синтаксис циклу while в bash виглядає наступним чином:
while [умова]
do
команди
done
Якщо [умова]
істинна, виконується блок do
.
Нижче наведено приклад циклу while. Цикл продовжує виконання до тих пір, поки значення змінної не стане менше 10. Усередині блока do ми збільшуємо значення змінної на 1 в кожній ітерації. Цикл завершується, коли умова стає хибною.
1 2 3 4 5 6 7 8 9 10 11 |
#!/bin/bash #оголошуємо змінну VAR=1 while [ $VAR -le 10 ] do echo "Значение переменной = $VAR" #збільшуємо значення змінної на 1 (( VAR++ )) done |
Результат:
Цикл for
Цикл for також застосовується для багаторазового виконання одного й того ж блоку коду. Синтаксис циклу for bash виглядає наступним чином:
for ((оголошення_змінних; умова; інкремент/декремент_лічильника))
do
команди
done
Розглянемо приклад циклу for, в якому збільшуватимемо значення змінної і виводитимемо його в кожній ітерації:
1 2 3 4 5 6 7 8 9 10 |
#!/bin/bash #оголошуємо цикл for for ((i=0; i<10; i++)) do #виводимо на екран значення змінної echo -n "$i " done echo "\n" |
Результат:
Висновки
Інструменти командного рядка можуть стати для вас чудовими помічниками в автоматизації рутинних завдань. Спочатку все це може налякати вас, але варто вам трохи освоїтися з консоллю і написанням скриптів, як ви відразу відчуєте всю силу, міць і величезний потенціал даного інструменту.