Локальные переменные

Тема дорожной карты · Bash

Локальные переменные в Bash объявляются внутри функций с помощью ключевого слова locallocal name=value — ограничивая их область видимости охватывающей функцией и её вызываемыми функциями, чтобы они не загрязняли глобальное пространство имён переменных shell-скрипта. Без local каждая переменная, присвоенная внутри функции Bash, является глобальной по умолчанию, что приводит к трудноуловимым ошибкам в shell-скриптах, когда функции с одинаковыми именами переменных, такими как i, file или result, неожиданно перезаписывают состояние друг друга. Ключевое слово local принимает те же модификаторы типов, что и declare: local -i count=0 объявляет локальное целое число, local -a items=() объявляет локальный индексированный массив, а local -r CONFIG="fixed" объявляет локальную константу только для чтения в области видимости функции. Использование переменных local — рекомендуемая практика написания Bash-скриптов, которая делает функции самостоятельными единицами, обеспечивает безопасную рекурсию, упрощает модульное тестирование с помощью таких инструментов, как BATS, и позволяет создавать более чистые кодовые базы автоматизации Linux. Сочетание переменных local с явными кодами return и возвращаемыми значениями на основе stdout создаёт функции Bash с чётко определёнными интерфейсами, которые компонуются в сложных shell-скриптах.

Как это работает

Локальные переменные: function_name() { commands; } определяет функцию. Аргументы — $1, $2, …, $@. Возвращаемые значения — через exit-код (return N); для реальных данных echo в stdout + захват через $(func). Локальные переменные: local var=value. Функции не first-class — нельзя передавать, нет closures (shell не язык программирования в этом смысле).

Когда применять

Выносите функцию, когда (а) блок повторяется, (б) у него есть осмысленное имя. local для всех внутренних переменных функции (иначе утекают в caller). Echo данных + захват лучше установки глобальных vars + чтения. Не используйте функции для "скорости" — bash-вызовы функций дороги vs C; для горячих циклов перепишите на настоящем языке.

Типичные ошибки

Ловушки Локальные переменные: забыли local и случайно модифицируют caller's $i (переменная цикла утекает); return "string" (return принимает только exit-код 0-255); функция зависит от cwd / глобального state без явного input (тяжело тестировать).

Связанные понятия

Полезные ресурсы