Кожен 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 скрипти:
- Ваш скрипт містить більше декількох сотень рядків.
- Вам потрібні структури даних складніше звичайних масивів.
- Вас задовбало займатися непотребством з лапками і екрануванням.
- Вам необхідно обробляти / змінювати багато строкових змінних.
- У вас немає необхідності викликати сторонні програми і немає необхідності в пайпах.
- Для вас важлива швидкість / продуктивність.