Пишемо скрипти на bash - як стати програмістом

Кожен Bash-скрипт варто починати зі наступних рядків:

Це захищає від двох частих помилок
1) Спроб використовувати не оголошені змінні
2) Ігнорування аварійного завершення команд
Якщо команда може завершитися аварійно, і нас це влаштовує, можна використовувати наступний код:

Потрібно пам'ятати що деякі команди не повертають код аварійного завершення наприклад "mkdir -p" і "rm -f".
Так само є складнощі з викликом ланцюжків підпрограм (command1 | command 2 | command3) з скрипта, для обходу цього обмеження можна використовувати наступну конструкцію:

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

Спробуйте перенести весь ваш код в функції залишивши тільки глобальні змінні / константи і виклик функції «main» в якій буде вся Високорівнева логіка.

Bash дозволяє оголошувати змінні декількох типів, найважливіші:
local (Для змінних використовуваних тільки усередині функцій)
readonly (Змінні спроба перепризначення яких викликає помилку)

Є можливість зробити змінну типу readonly з уже оголошеної:

Прагніть до того що б всі ваші змінні були або local, або readonly, це поліпшить читаність і знизить кількість помилок.

Використовуйте $ () замість зворотних лапок «

Зворотні лапки погано читаються і в деяких шрифтах легко можуть бути переплутані з одинарними лапками.
Конструкція $ () так само дозволяє використовувати вкладені виклики без головного болю з екрануванням:

Використовуйте подвійні квадратні дужки [[]] замість одинарних []

Подвійні квадратні дужки дозволяють уникнути ненавмисного використання шляхів замість змінних:

У деяких випадках спрощують синтаксис:

А так же надають додаткову функціональність:

  • || Логічне АБО (logical or) - тільки з подвійними дужками.
  • Логічне І (logical and) - тільки з подвійними дужками.
  • <Сравнение строковых переменных (string comparison) — с двойными скобками экранирование не нужно.
  • == Порівняння строкових змінних з підстановкою (string matching with globbing) - тільки з подвійними дужками.
  • =

Порівняння строкових змінних використовуючи регулярні вирази (string matching with regular expressions) - тільки з подвійними дужками.

  • -lt Цифрове порівняння (numerical comparison)
  • -n Строкова змінна не порожня (string is non-empty)
  • -z Строкова змінна порожня (string is empty)
  • -eq Цифрове рівність (numerical equality)
  • -ne Цифрове нерівність (numerical inequality)

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

Порівняння строкових змінних з підстановкою так само є в операторі case:

Робота зі рядковими змінними:

В bash є декілька розважальних (недооцінених) можливостей роботи з рядковими змінними:
базові:

Заміна з підстановкою:

Видалення з підстановкою:
# Видалення з початку рядка, до першого збігу

# Видалення з початку рядка, до останнього збіги

# Видалення з кінця рядка, до першого збігу

# Видалення з кінця рядка, до останнього збіги

Позбавляємося від тимчасових файлів

Деякі команди очікують на вхід ім'я файлу, з ними нам допоможе оператор '<()’, он принимает на вход команду и преобразует в нечто что можно использовать как имя файла:
# Завантажити два URLa і передати їх в diff

Використання маркера для передачі багаторядкових змінних:
# MARKER - будь-яке слово.

Якщо ви хочете уникнути підстановки, то маркер можна взяти в лапки:
# Конструкція поверне '$ var' а не значення змінної

вбудовані змінні

  • $ 0 Ім'я скрипта (name of the script)
  • $ 1 $ 2 ... $ n Параметри передані скрипту / фнукцій (positional parameters to script / function)
  • $$ PID скрипта (PID of the script)
  • $! PID останньої команди виконаної в фоні (PID of the last command executed (and run in the background))
  • $? Статус повернутий останньою командою (exit status of the last command ($ for pipelined commands))
  • $ # Кількість параметрів переданих скрипту / функції (number of parameters to script / function)
  • $ @ Всі параметри передані скрипту / функції, представлені у вигляді слів (sees arguments as separate word)
  • $ * Всі параметри передані скрипту / функції, представлені у вигляді одного слова (sees arguments as single word)
  • Як правило:
  • $ * Рідко є корисною
  • $ @ Коректно обробляє порожні параметри і параметри з пробілами
  • $ @ При використанні зазвичай полягає в подвійні лапки - «$ @»

Перевірка синтаксису (економить час якщо скрипт виконується довше 15 секунд):

Трасування з розкриттям складних команд:

Параметри -v і -x можна задати в коді, це може бути корисно якщо ваш скрипт працює на одній машині а журнал ведеться на інший:

Ознаки того, що ви не повинні використовувати shell скрипти:
  • Ваш скрипт містить більше декількох сотень рядків.
  • Вам потрібні структури даних складніше звичайних масивів.
  • Вас задовбало займатися непотребством з лапками і екрануванням.
  • Вам необхідно обробляти / змінювати багато строкових змінних.
  • У вас немає необхідності викликати сторонні програми і немає необхідності в пайпах.
  • Для вас важлива швидкість / продуктивність.

Схожі статті