Як це не потворно, ось вирішення, яке працює до тих пір, поки ви не передаєте явно масив, а змінну, що відповідає масиву:
function passarray()
{
eval array_internally=("$(echo '${'$1'[@]}')")
# access array now via array_internally
echo "${array_internally[@]}"
#...
}
array=(0 1 2 3 4 5)
passarray array # echo's (0 1 2 3 4 5) as expected
Я впевнений, що хтось може придумати більш чітку реалізацію ідеї, але я вважав це кращим рішенням, ніж передавати масив як "{array[@]"}
і потім отримувати доступ до нього внутрішньо за допомогою array_inside=("$@")
. Це ускладнюється, коли є інші позиційні / getopts
параметри. У цих випадках мені довелося спочатку визначити, а потім видалити параметри, не пов'язані з масивом, використовуючи деяку комбінацію shift
та видалення елементів масиву.
Пуристська перспектива, ймовірно, розглядає цей підхід як порушення мови, але прагматично кажучи, цей підхід врятував мені чимало горя. У відповідній темі я також використовую eval
для призначення внутрішньо побудованого масиву змінній, названій відповідно до параметра, який target_varname
я передаю функції:
eval $target_varname=$"(${array_inside[@]})"