Предположим, у меня очень большой массив $large_list
, есть ли способ написать функцию, которая будет принимать массив в качестве аргумента? Например:
echo_idx_array () {
arr="$1"
idx="$2"
echo "${arr[$idx]}"
}
Какова обычная стратегия сделать что-то подобное? Я попытался дать переменную, $large_list
но она была пуста.
Я готов изменить функцию, чтобы адаптировать ее к любым изменениям в списке аргументов.
Для записи я использую ksh88 и ищу ответы настолько портативные, насколько это возможно.
РЕДАКТИРОВАТЬ : до сих пор лучшее, что я мог придумать, это перебрать массив и отправить каждый элемент в качестве аргумента функции. Это кажется невероятно уродливым и подверженным ошибкам, не говоря уже о том, что оно непременно достигнет определенного предела. Вот что я сделал:
foo () {
echo $*
}
cmd="foo "
while [[ $i -lt $MAX_ARR_SIZE ]]; do
cmd="$cmd ${large_list[$i]}"
((i=i+1))
done
eval $cmd
Разве нет ничего лучше?
func "${array[@]}"
? Если вам нужно передать только один элемент, просто передайте элемент - не нужно делать его более сложным, передавая массив и индекс."${array[$@]}
. Ваше предложение действительно работает. Моя вина.Ответы:
Чтобы передать элементы массива в качестве аргументов функции, используйте синтаксис ksh, чтобы развернуть элементы массива в виде списка.
[@]
Суффикс делает это расширение массива. Двойные кавычки защищают каждый элемент от дальнейшего расширения (расщепления и сглаживания). Результатом раскрытия обычно является не одно слово, как обычно с двойными кавычками, а столько слов, сколько элементов в массиве.N - й элемент массива затем . Чтобы получить к нему доступ, вам необходимо использовать ; см. Использование ссылки на переменную "внутри" другой переменной.
${N}
eval
источник
myarray=("hello world" wibble)
(2 элемента, первый из которых содержит пробел):work_on_array "${myarray[@]}"
передает 2 параметраhello world
иwibble
;work_on_array ${myarray[@]}
передает 2 параметраhello
,world
иwibble
. И сmyarray=(*)
,work_on_array ${myarray[@]}
передает список файлов в текущем каталоге. (Следовательно, это один из многих случаев, когда мой совет имеет практическое значение.)hello
,world
иwibble
сделать 3 параметра.)В bash 4.3+ есть способ, который, вероятно, исходит из ksh:
Смотрите также
declare -n
.источник
Зависит от оболочки Korn… последние версии AT & T ksh93 и mksh поддерживают это:
В моей текущей оболочке это выдает «b».
источник