Каков наиболее правильный способ передать массив функции?

У меня есть очень большой массив $large_list , есть ли способ написать функцию, которая примет массив в качестве аргумента? Например:

 echo_idx_array () { arr="$1" idx="$2" echo "${arr[$idx]}" } 

Какова обычная стратегия сделать что-то подобное? Я попытался предоставить переменную $large_list но она была пустой.

Я готов изменить функцию, чтобы адаптировать ее к любому изменению в списке аргументов.

Для записи я использую ksh88, и я ищу ответы как портативные, какие могут быть.


EDIT : Пока лучшее, что я мог придумать, – это перебрать массив и отправить каждый элемент в качестве аргумента функции. Это кажется невероятно уродливым и подверженным ошибкам, не говоря уже о том, что он быстро ударит по определенному пределу. Вот что я сделал:

 foo () { echo $* } cmd="foo " while [[ $i -lt $MAX_ARR_SIZE ]]; do cmd="$cmd ${large_list[$i]}" ((i=i+1)) done eval $cmd 

Не лучше ли что-то сделать?

Чтобы передать элементы массива в качестве аргументов функции, используйте синтаксис ksh, чтобы развернуть элементы массива в виде списка.

 work_on_array "${myarray[@]}" 

Суффикс [@] делает это расширение массива. Двойные кавычки защищают каждый элемент от дальнейшего расширения (расщепление и глобус). Результатом расширения не является в общем одно слово, как обычно, с двойными кавычками, но столько слов, сколько есть элементов в массиве.

N- й элемент массива – это ${ N } . Чтобы получить доступ к нему, вам нужно использовать eval ; см. Использование ссылки на переменную «внутри» другой переменной

Есть путь в bash 4.3+, который, вероятно, исходит из ksh:

 echo_idx_array () # array index { local -n array=$1 # add nameref attribute local idx=$2 echo "${array[idx]}" } $ names=(one two three four) $ echo_idx_array names 2 three $ days=([monday]=eggs [tuesday]=bread [sunday]=jam) # associative array $ echo_idx_array days sunday jam 

См. Также declare -n .

Зависит от Korn Shell … последние версии AT & T ksh93 и mksh поддерживают это:

 function echo_idx_array { nameref arr=$1 idx=$2 echo "${arr[idx]}" } set -A test -- abc echo_idx_array test 1 

В моей текущей оболочке это выводит «b».