Ответ 1
#!/bin/bash
ar=( a b c )
test() {
local ref=$1[@]
echo ${!ref}
}
test ar
Как передать массив функции, и почему это не будет работать? Решения по другим вопросам для меня не сработали. Для записи мне не нужно копировать массив, чтобы я не пропустил ссылку. Все, что я хочу сделать, это перебрать его.
$ ar=(a b c)
$ function test() { echo ${1[@]}; }
$ echo ${ar[@]}
a b c
$ test $ar
bash: ${1[@]}: bad substitution
$ test ${ar[@]}
bash: ${1[@]}: bad substitution
#!/bin/bash
ar=( a b c )
test() {
local ref=$1[@]
echo ${!ref}
}
test ar
Я понимаю, что этот вопрос почти два года, но он помог мне разобраться с фактическим ответом на исходный вопрос, который на самом деле не отвечает ни на один из вышеперечисленных ответов (ответы @ata и @l0b0). Возникает вопрос: "Как передать массив функции bash?", В то время как @ata был близок к правильной настройке, его метод не содержит фактического массива для использования внутри самой функции. Требуется одно небольшое дополнение.
Итак, предполагая, что мы имели anArray=(a b c d)
где-то перед вызовом функции do_something_with_array()
, так мы определяем функцию:
function do_something_with_array {
local tmp=$1[@]
local arrArg=(${!tmp})
echo ${#arrArg[*]}
echo ${arrArg[3]}
}
Теперь
do_something_with_array anArray
Будет корректно выводиться:
4
d
Если есть вероятность, что какой-либо элемент вашего массива может содержать пробелы, вы должны установить IFS
значение, отличное от SPACE, а затем назад после того, как вы скопировали аргумент (-ы) массива функций в локальные массивы, Например, используя приведенное выше:
local tmp=$1[@]
prevIFS=$IFS
IFS=,
local arrArg=(${!tmp})
IFS=$prevIFS
ar
не является первым параметром для тестирования. Это все параметры. Вы должны будете echo "[email protected]"
в своей функции.