Як відомо, в bash всі функції і команди повертають лише код повернення (нуль - успішне завершення, чи не-нуль - помилка). Для того, щоб повернути щось відмінне від числа, потрібно використовувати один з наступних прийомів:
- установка глобальної змінної
- використання підстановки (читання виведення команди)
- передача непрямого посилання в функцію
Розглянемо докладніше, як же використовувати дані підходи.
Установка глобальної змінної
Що може бути простіше, ніж загидити глобальну область видимості в функції, і потім вважати з неї дані в основній програмі?
Воно й зрозуміло, адже всі змінні в bash за замовчуванням - глобальні.
Іcпользованіе підстановки, aka $ (function)
Досить поширений механізм. Ви вже, напевно, самі не знаючи того, неодноразово їм користувалися. Ідея в тому, що ми зберігаємо в змінну все, що виводить якась команда (функція - теж команда). Ну і звичайно, що б без необхідності не засмічувати глобальну область видимості, рекомендується використовувати локальні змінні.
Передача непрямого посилання (Indirect References) в функцію
Найцікавіший, функціональний і незграбний механізм :)
Це простіше 1 раз побачити, ніж 100 разів почути:
А тепер по-чесному і по порядку
На відміну від деяких інших мов програмування, в bash сценаріях параметри в функцію зазвичай передаються за значенням. Якщо імена змінних (які фактично є покажчиками) будуть передані в функцію як параметри, то вони будуть оброблені, як рядкові літерали.
Функції обробляють свої аргументи, як літерали.
Змінні - це спосіб представлення даних в різних мовах програмування. Змінна не більш ніж мітка - ім'я, призначене області або групі областей пам'яті комп'ютера, де містяться дані.
Ім'я змінної - це "контейнер" для зберігання значення даних. Звернення до значення (отримання значення) змінної називається підстановкою змінної.
Зазначу, що треба розрізняти ім'я змінної і її значення. Якщо variable1 - ім'я змінної, то $ variable1 - звернення до значення. яке вона містить.
Як сказано вище, після підстановки змінної (referencing a variable. $ Var), ми отримуємо значення. на яку вказує змінна. А як щодо значення, на яке укзивает саме значення. $$ var. Ви ж пам'ятаєте, що зі змінними ми працюємо просто як з літералами. ) Ну ось ми і намагаємося отримати значення, на яке вказує змінна, ім'я якої теж є значенням іншої змінної. Трохи заплутано, але, сподіваюся, вловили.
Приклад 1. Для розуміння
Приклад 2. Практичний
Так як ім'я змінної саме зберігається в змінної, ми не можемо встановити його безпосередньо. Для цього використовують eval. Якщо в кратце, eval повідомляє bash -інтерпретатору, що необхідно двічі проінтерпретувати рядок. У перший раз він встановить result = 'some value'. а в другій - шукану змінну (яку передали як аргумент).
При збереженні імені змінної, яку передали як аргумент командного рядка, переконайтеся, що зберігаєте її локально і в змінну з відмінним (по можливості) ім'ям, ніж використовувалася в командному рядку. Якщо цього не зробити, і ім'я змінної, переданої як параметр командного рядка, співпаде з ім'ям локальної змінної, в яку Ви зберігаєте значення, то нічого не буде працювати: D
Приклад 3. Не працює!
Чому? Ну. в той момент коли eval робить другу підстановку в result = 'some value'. result - вже локальна змінна функції, тому ми встановимо її ще разок, а не шукану змінну.
Для більшої гнучкості, можна комбінувати різні підходи:
Приклад 4. Універсальний
Тобто якщо в функцію не передана жодного параметра, значення просто виводиться в stdout.