Консоль в маси. Перехід на світлу сторону. Bash

keep calm-and-bin-bash

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

Ми дісталися до самої цікавої і захоплюючої теми — це скрипти на
bash
. Коли ви запускаєте термінал, всередині нього працює спеціальна програма-оболонка —
shell
(англ) — інтерпретатор команд. Shell розуміє всі команди, які ви вводите з клавіатури, і обробляє їх. Також виводить повідомлення про помилки, стежить за коректністю команд і їх синтаксисом. Прикладом таких команд можуть бути: змінити директорію, створити нову директорію, додати текстовий файл, відредагувати текстовий файл, зберегти зміни та інші.


Програм-оболонок досить багато. Одна з перших вдалих реалізацій називається
s
. Її розробив Стівен Борн в 1977 році (wiki). В 99% випадків, коли ви працюєте за комп'ютером під керуванням
OS *nix
, оболонкою за промовчанням, яка обробляє команди, буде bash. Звичайно, є ще така оболонка
zsh
та інші, але це вже зовсім інша історія.

Важливий момент. Дана стаття не є вичерпним керівництвом по скриптам на bash. Головна мета — розглянути основи програмування на bash, показати приклади, дати читачеві базові знання, яких вистачить, щоб рухатися далі. В кінці статті є корисні посилання і ви зможете більш детально вивчити дану тему.

Основи
Перший розділ присвячено основам. Розглянемо з чого має починатися будь-скрипт. Як визначаються змінні і як змінювати значення цих змінних. Також розберемося як передавати аргументи скрипту і обробляти ці аргументи всередині скрипта. Наступний розділ — це розгалуження. І останній, але не менш важливий розділ — цикли.

Для початку нам потрібно знати де знаходиться bash. Ця інформація нам знадобитися при написанні самих скриптів. Щоб дізнатися, де знаходитися bash, виконайте наступну команду:

which bash # де знаходиться bash

Будь-який скрипт на bash повинен починатися з рядка:

#!/bin/bash

Тим самим ми говоримо інтерпретатору яку програму викликати, якщо виконуваний скрипт. За замовчуванням всі файли, які створює користувач, не є виконуваними. Ми повинні явно вказати для конкретного файлу цей параметр за допомогою команди:

chmod +x <filename>

Змінні
Змінна — це іменована область пам'яті. Це означає, що у змінної є ім'я і воно посилається на певну комірку пам'яті комп'ютера. Зазвичай змінні використовуються для зберігання будь-якої інформації. Будь-яка змінна складається з двох частин: ім'я і значення.

Ім'я змінної:

  • букви, цифри, знак нижнього підкреслення (
    _
    )
  • не може починатися з цифри

Значення змінної:

  • числа, рядки (якщо є прогалини, то в лапках), окремі символи

Створення (перезапис) змінної:

path=$HOME

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

Читання змінної:

$path

Передача аргументів скрипту:

./script.sh arg1 arg2 arg3 ... argN

Обробка аргументів усередині скрипта:

$1 # перший аргумент
$2 # другий аргумент
$0 # ім'я скрипта
$# # кількість аргументів

Ну що, настав час написати перший скрипт. Як це і повинно бути, скрипт буде виводити на екран рядок «Hello, world!».

Ось так просто, на bash можна реалізувати приклад з «Hello, world!». Нагадую, що всі приклади ви можете знайти на репозиторії. Давайте розглянемо ще один приклад. На цей раз попрацюємо зі змінними, а також з аргументами, які користувач передає скрипту.

Зверніть увагу на те, що всі програми, написані на bash, зазвичай мають розширення
.sh
.

Розгалуження
З основами і змінними трохи розібралися. Тепер перейдемо до ветвлениям. Для роботи з ветвлениями в bash нам доступні наступні конструкції:
  1. if
  2. if/else
  3. if/elif/else
  4. case/in/esac
Перші три варіанти схожі і кожна наступна конструкція доповнює попередню. Розглянемо найпростіший варіант:

Зверніть увагу на те, що в кінці кожного рядка відсутня крапка з комою. Є можливість писати умови (і не тільки) в одну лінію, тоді крапка з комою потрібні.

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

Умови (рядка):


Умови (числа/рядка):


Умови (файли):


Умови (логічні):


Варіант
if/else
ми пропустимо. А ось
if/elif/else
пропоную розглянути на прикладі:

Скрипт очікує отримати на вхід один аргумент — ім'я файлу або ім'я директорії. Далі йде перевірка, чи дійсно це файл або директорія. Якщо так, то виконуємо видалення. Якщо переданий аргумент не є файлом ні директорією, виводимо повідомлення користувачеві, що видалення неможливо.

Нам залишилося розглянути останній варіант розгалуження — це
case/in/esac
. Якщо проводити аналогію з JavaScript, то це варіант реалізації
switch/case
. Розглянемо цю конструкцію теж на прикладі.


Даний скрипт очікує отримати два числових аргументу: одиницю і двійку. І в залежності від того, який аргумент буде першим, створюється файл чи директорія. Також є перевірка на кількість аргументів, які передав користувач. Кількість аргументів не має бути менше двох. Якщо користувач передав неправильні аргументи, виводимо повідомлення про це. За це відповідає значення за замовчуванням.

Цикли
Наступний розділ, який ми розглянемо — це робота з циклами. Для організації циклів в арсеналі bash присутні такі конструкції:
for/in
та
while
.

Давайте розглянемо синтаксис
for/in
:


i
— це ім'я змінної, в яку буде передаватися елемент масиву.
array
— це сам масив. На кожній наступній ітерації
i
отримує наступне значення з масиву. Розглянемо приклад:


Є список значень:
1 2 3 4 5
. Запускаємо цикл, який проходиться по всіх значень. Створюємо змінну
file_name
. Потім перевіряємо чи існує файл з таким ім'ям. Якщо файлу немає — створюємо його, якщо є пропускаємо крок створення.

Ви могли помітити слово
continue
— це ключове слово. Дозволяє пропустити ітерацію і продовжити роботу далі. Також є ключове слово
break
— перериває виконання скрипта. Використовуються ці ключові слова тільки в контексті
if/else
.

Наступна конструкція, яку ми розглянемо для роботи з циклами, буде
while
:


Пропоную відразу ж розглянути приклад:


У даному прикладі є два рядки з ключовим словом
read
. Розглянемо більш докладно як працюють ці рядки. А саме: рядок номер дванадцять і рядок номер вісім. Почнемо з рядка номер дванадцять. Поки змінна
$again
дорівнює значенню
"так"
, програма просить ввести ім'я користувача і виводить його на екран. Після цьогу скрипт питає, чи ми хочемо продовжити. І так до тих пір, поки користувач не введе будь-яку іншу рядок замість
yes
або просто натисне
Enter
. Але набагато цікавіше код на рядку номер вісім. Присутня змінна
$name
, яка не оголошена до цього. Ця змінна створюється динамічно і потім зчитується її значення.

Корисні посилання
  1. Basics of Bash
  2. bash-handbook
  3. Підводні камені Bash
  4. Learn the Command Line
  5. The Command Line Crash Course
  6. Linux Command Line in Російська
  7. Basic Unix commands


Замість висновку
На цій позитивній ноті ми закінчимо знайомство з bash. Цієї інформації достатньо, щоб реалізувати простенькі скрипти, а також автоматизувати повсякденні завдання.

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

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

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.