declare -n): ссылки на переменные и передача массивов в функцииВ Bash функции по умолчанию работают с копиями значений или с глобальными переменными. Но есть механизм, который позволяет имитировать “ссылки” -
nameref.▪️Что такое nameref
declare -n создаёт ссылку на другую переменную:arr=(1 2 3)
declare -n ref=arr
ref[0]=999
echo "${arr[0]}"
Результат:999
ref не хранит данные - он указывает на arr.▪️Передача массива в функцию без копирования
Классическая проблема:
func() {
local arr=("$@")
}
Это создаёт копию массива.С
nameref:func() {
local -n arr=$1
echo "${arr[0]}"
}
Вызов:data=(10 20 30)
func data
Функция работает с оригинальным массивом.▪️Модификация массива внутри функции
func() {
local -n arr=$1
arr[1]=999
}
data=(10 20 30)
func data
echo "${data[@]}"
Результат:
10 999 30
▪️Где это особенно полезнофункции обработки конфигураций
парсинг JSON → массивы ключей/значений
работа с таблицами данных
построение библиотек на Bash без глобальных переменных
▪️Важный момент
nameref работает только с именами переменных:local -n ref=$1
Нельзя передавать:• значения
• выражения
• результаты команд
Только имя переменной.
▪️Ограничения
нельзя безопасно переиспользовать ссылку на разные переменные в одном scope без переопределения
сложнее отлаживать (меняется оригинальный объект)
требует Bash 4.3+
▪️Почему это важно
Без
nameref Bash-функции либо копируют данные, либо используют глобальное состояние. declare -n даёт третий вариант — передачу по ссылке, что делает сложные скрипты заметно чище и ближе к языкам общего назначения.BashTex 📱 #scripts #linux