Когда ты передаешь переменные в функции - по умолчанию это копии, а не ссылки. Но с declare -n (aka nameref) можно менять переменные по ссылке, включая элементы массивов и даже динамические имена переменных.
❓ Что такое nameref?
declare -n ref=имя - создает ссылку на переменную, позволяя функции менять её напрямую.▪️ Пример: модификация значения по ссылке
modify() {
declare -n ref=$1
ref="Изменено внутри функции"
}
value="Оригинал"
modify value
echo "$value" # Изменено внутри функции
▪️ Пример: изменение массива внутри функции
update_array() {
declare -n arr=$1
arr+=("новый элемент")
}
my_array=("один" "два")
update_array my_array
printf "%s\n" "${my_array[@]}"
Вывод:
один
два
новый элемент
▪️ Комбинирование с итерацией и позиционными аргументами
double_values() {
declare -n numbers=$1
for i in "${!numbers[@]}"; do
numbers[$i]=$((numbers[$i] * 2))
done
}
arr=(10 20 30)
double_values arr
echo "${arr[@]}" # 20 40 60
❗️ Когда использовать nameref?
📍 Когда хочется возвращать несколько значений из функции
📍 Когда работаешь с динамическими именами переменных
📍 Когда пишешь библиотеки/модули на Bash
BashTex 📱 #bash #utils