Как бы уродливо это ни было, вот обходной путь, который работает до тех пор, пока вы не передаете массив явно, а переменную, соответствующую массиву:
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[@]})"