Как ограничить видимость переменной между двумя функциями в скрипте на Bash?

Ответ

В Bash для изоляции переменных между функциями используется ключевое слово local. Переменная, объявленная как local внутри функции, не видна за её пределами и в других функциях.

Пример:

#!/bin/bash

function first_func() {
    local secret_var="Это видно только в first_func"
    echo "Inside first_func: $secret_var"
    second_func
}

function second_func() {
    # Эта переменная существует независимо от secret_var в first_func
    local secret_var="Это видно только в second_func"
    echo "Inside second_func: $secret_var"
    # Попытка обратиться к переменной из first_func приведет к пустому значению
    echo "Trying to access first_func's var: ${secret_var_from_first:-'Variable not found'}"
}

# Глобальная переменная
global_var="Я глобальная"

echo "Global: $global_var"
first_func
echo "Global after calls: $global_var"
# Следующая строка вызовет ошибку или покажет пустоту, если переменная не объявлена глобально
# echo "Outside: $secret_var"

Вывод скрипта:

Global: Я глобальная
Inside first_func: Это видно только в first_func
Inside second_func: Это видно только в second_func
Trying to access first_func's var: Variable not found
Global after calls: Я глобальная

Ключевые моменты для автоматизации:

  • local — основа инкапсуляции в функциях Bash.
  • Без local переменная становится глобальной и может быть случайно изменена другой функцией.
  • Для передачи данных между функциями используйте аргументы ($1, $2) или возвращайте значения через stdout и захватывайте их с помощью $().

Ответ 18+ 🔞

А, ну ты про баш-скрипты заговорил! Слушай, тут история про изоляцию переменных — просто ёперный театр, если честно. Представь: пишешь ты функцию, объявляешь там переменную, а она, сука, вылезает наружу и начинает всем мешать, как назойливый сосед. Пиздец, неудобно.

Так вот, чтобы такого не было, в Баше есть волшебное слово local. Это как сказать переменной: «Сиди тут, блядь, и не высовывайся». Объявил её с этим local внутри функции — и всё, она там и остаётся. Снаружи её нихуя не видно, и в других функциях — тоже. Каждая функция живёт в своём мирке, и доверия между ними — ебать ноль, что очень правильно.

Смотри, вот тебе пример, чтобы совсем понятно стало. Я тут набросал скрипт, он как раз показывает эту магию.

#!/bin/bash

function first_func() {
    local secret_var="Это видно только в first_func"
    echo "Inside first_func: $secret_var"
    second_func
}

function second_func() {
    # Эта переменная существует независимо от secret_var в first_func
    local secret_var="Это видно только в second_func"
    echo "Inside second_func: $secret_var"
    # Попытка обратиться к переменной из first_func приведет к пустому значению
    echo "Trying to access first_func's var: ${secret_var_from_first:-'Variable not found'}"
}

# Глобальная переменная
global_var="Я глобальная"

echo "Global: $global_var"
first_func
echo "Global after calls: $global_var"
# Следующая строка вызовет ошибку или покажет пустоту, если переменная не объявлена глобально
# echo "Outside: $secret_var"

Запустишь это дело, и вывод будет такой, что ни хуя себе:

Global: Я глобальная
Inside first_func: Это витно только в first_func
Inside second_func: Это видно только в second_func
Trying to access first_func's var: Variable not found
Global after calls: Я глобальная

Видишь, в чём прикол? У каждой функции своя secret_var, и они друг про друга нихуя не знают. Вторая функция пытается найти чужую переменную — и получает пустоту, ядрёна вошь. А глобальная переменная global_var — она как тот общий друг, который везде свой в доску, её все видят.

Так что запомни главное, чувак:

  • local — это твой главный инструмент, чтобы не наделать каши в скрипте. Без него любая переменная станет глобальной, и потом будешь искать, какая хитрая жопа её переписала.
  • Если функциям нужно пообщаться — передавай данные аргументами (это $1, $2 и так далее) или пусть одна функция что-то выводит в консоль, а другая это перехватывает через $(). Всё честно, без подвохов.

Вот и вся наука. Не усложняй, используй local, и будет тебе счастье, а не пиздопроебибна с переменными, которые живут своей жизнью.