BASH використання функцій, приклади

По суті функція bash є звичайною змінною, але з ширшими можливостями.

Основне застосування - у тих випадках, коли один і той же код необхідно використовувати кілька разів та/або у різних пов'язаних скриптах.

Оголошення та виклик функції

Оголошується функція так:

Однак, найбільш правильним варіантом, з метою сумісності скрипту з різними shell-оболонками буде другий:

І намагайтеся ніколи не використовувати третій варіант:

Викликати функцію можна просто вказавши її ім'я у тілі скрипта:

Виклик функції з аргументами

Перейдемо до більш складної функції та розглянемо виклик функції з аргументами.

Для прикладу - візьмемо функцію, яка викликається там коду, де необхідно отримати відповідь від користувача:

В даному випадку, функція answer очікує відповіді від користувача в стилі Yes або No (або будь-яка варіація, задана у виразі [yY][eE][sS][yY] або [nN][oO][nN] ), та в залежності від відповіді виконує певну дію.

Наприклад, у разі відповіді Yes — буде виконано дію, задану у першому аргументі $1 , з яким була викликана функція:

Або спробуємо відповісти No:

Виклик команд безпосередньо з аргументів, а тим більше зі змінних, вважається не найкращим рішенням, тому давайте перепишемо її і викличемо з операторами && (у разі успішного виконання, тобто при отриманні коду 0) і - у разі помилки та отримання коду відповіді 1:

Тепер ми першим аргументом передаємо функції відповідь "Run", і у разі відповіді користувача Yes - виконуємо printf "Run" і echo "I'm script". Якщо вибрано відповідь No — ми друкуємо другий аргумент Will not run і виконуємо дію echo "Doing nothing" :

Відповідно, замість echo можна виконати будь-яку іншу команду:

Важливо враховувати, що якщо перша команда завершиться невдало (у даному прикладі - не знайде вказаний PID) - то функція поверне код 1, і буде виконана друга частина:

Змінні у функціях

У аргументах також можна використовувати змінні.

Наприклад, можна визначити кілька варіантів відповідей у ​​різних змінних, і використовувати потрібну в різних випадках:

Як і зі звичайними змінними функції використовують «позиційні агрументи», тобто:

$# - Висновок кількості переданих аргументів; $* - виведення списку всіх переданих аргументів; $@ - те саме, що і $ * - але кожен аргумент вважається як просте слово (рядок); $1 - $9 — нумеровані аргументи, залежно від позиції списку.

Наприклад — створимо такий скрипт із функцією, яка має вивести кількість переданих аргументів:

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

А можна аргументи передавати прямо при виклику функції, а не при виклику скрипту як у прикладі вище:

Локальні змінні

За замовчуванням, всі задані змінні в bash-скриптах вважаються глобальними в рамках скрипта. У функції можна оголосити змінну, яка буде доступна лише під час її (функції) виконання. Приклад:

Математичні операції у функціях

Як і змінних, у функціях припустимо використання математичних операцій.

Наприклад така функція:

В результаті отримуємо значення змінної $a + одиниця:

Більш складний варіант – з використанням кількох змінних та обчисленням їх значення:

Ще варіант - з використанням аргументів:

Рекурсивні функції

Рекурсивна функція - функція, яка привиклик викликає сама себе.

Така функція буде нескінченно викликати сама себе, поки її виконання не буде перервано вручну:

Для більшої наочності – додамо цикл, який перевіряє умову – якщо змінна $count перевищить значення змінної $recursions – функція зупинить своє виконання:

Для спрощення скрипту - можна замінити вираз count = $ (($ count + 1)) на (( count + +)) :

Експорт функцій

Щоб передати функцію в наступний скрипт, що викликається в новому (дочірньому) екземплярі shell - її необхідно експортувати.

Наприклад візьмемо два файли — у файлі 1.sh ми оголосимо функцію, а файлі 2.sh — спробуємо її виконати:

Тепер - експортуємо функцію за допомогою опції export та ключа -f:

Інший варіант — викликати наступний скрипт у тому ж екземплярі шела:

Обидва варіанти рівнозначні і дадуть один результат:

Перевірка наявності функцій

Іноді потрібно перевірити чи є функція, перед виконанням. Для цього зручно використовувати команду declare.

Викликана з ключем -f і без аргументів - declare виведе опис усіх функцій:

З ключем -F - тільки назви:

Якщо задати імена функцій як аргументи - declare просто виведе їх імена:

Можна задати ключ -f та ім'я функції, тоді буде виведено опис лише вказаної функції:

Перевірити наявність функцій перед їх виконанням можна за допомогою додаткової функції, якій передаються імена функцій, що перевіряються:

Зверніть увагу на використання $@ - як писалося вище, саме такий параметр виводить аргумент "як є", тобто простим словом, без будь-яких інтерпретацій bash -ем.

Запустимо скрипт для перевірки:

А тепер спробуємо додати одну «зайву» функцію:

declare виявив відсутність функції з ім'ям three і повернув код 1, що спричинило спрацювання оператора .