Як повернути значення з bash функції, zen notes

Як відомо, в 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.

Схожі статті