Я передаю несколько массивов между функциями и хотел бы знать, лучше ли объявить nameref (введено в bash 4.3) или использовать косвенное расширение. Стилистически я предпочитаю использовать namerefs, поскольку я могу манипулировать локальным массивом так же, как и исходным, плюс, AFAIK, невозможно добавить к ассоциативному массиву с помощью косвенного расширения . Есть ли какие-либо недостатки в использовании nameref, кроме минимального bash ограничения версии?
Примеры
Nameref:
#!/usr/bin/env bash
unset arr
declare -Ag arr['lock']='key'
arr['door']='window'
f(){
unset my_arr
declare -n my_arr="$1"
my_arr['pants']='shirt'
echo "${my_arr['door']}"
echo "${my_arr['lock']}"
}
$ f arr
window
key
$ echo "${arr['pants']}"
shirt
Косвенное расширение:
#!/usr/bin/env bash
unset arr
declare -Ag arr['lock']='key'
arr['door']='window'
f(){
arr_door=$1['door']
arr_lock=$1['lock']
echo "${!arr_door}"
echo "${!arr_lock}"
}
$ f arr
window
key