В Bash 4.3+ появилась фича -
nameref, или "ссылочные переменные". Она позволяет работать с переменной по её имени, как с указателем. Удобно для динамического доступа, написания функций и шаблонов.❓ Что такое declare -n?
declare -n ссылка=имя_переменной
Теперь ссылка становится псевдонимом для имя_переменной.
▪️ Простой пример
name="Linux"
declare -n ref=name
echo "$ref" # → Linux
ref="Bash"
echo "$name" # → Bash
Переменная ref на самом деле редактирует name. Прямая манипуляция через ссылку.
▪️ Реальный кейс: функция, меняющая любую переменную
update_var() {
declare -n target=$1
target="Новое значение"
}
val="Старое"
update_var val
echo "$val" # → Новое значение
Без declare -n пришлось бы возвращать значение через stdout или временный файл.
▪️ Пример с массивами
arr1=(a b c)
arr2=(1 2 3)
print_array() {
declare -n ref=$1
for item in "${ref[@]}"; do echo "$item"; done
}
print_array arr1
print_array arr2
Теперь можно передавать имя массива как аргумент, а не содержимое.
🌟 Важно
- Работает только в Bash 4.3+
- declare -n не копирует значение, а создаёт указатель
- Можно делать цепочки: declare -n a=b, declare -n b=c, но лучше не злоупотреблять
BashTex 📱 #bash #utils