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, що спричинило спрацювання оператора .