Подтвердить что ты не робот

Как передать массив функции bash

Как передать массив функции, и почему это не будет работать? Решения по другим вопросам для меня не сработали. Для записи мне не нужно копировать массив, чтобы я не пропустил ссылку. Все, что я хочу сделать, это перебрать его.

$ 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
4b9b3361

Ответ 1

#!/bin/bash
ar=( a b c )
test() {
    local ref=$1[@]
    echo ${!ref}
}

test ar

Ответ 2

Я понимаю, что этот вопрос почти два года, но он помог мне разобраться с фактическим ответом на исходный вопрос, который на самом деле не отвечает ни на один из вышеперечисленных ответов (ответы @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

Ответ 3

ar не является первым параметром для тестирования. Это все параметры. Вы должны будете echo "[email protected]" в своей функции.