2011-11-10 17 views
12

Come si passa un array a una funzione e perché non dovrebbe funzionare? Le soluzioni in altre domande non hanno funzionato per me. Per la cronaca, non ho bisogno di copiare l'array quindi non mi interessa passare un riferimento. Tutto quello che voglio fare è passarci sopra.Come passare un array a una funzione 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 

risposta

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

test ar 
+0

Va bene, che funziona: test() { locale ref = $ 1 [@] per pkg in $ {! ref}; do echo "1 $ pkg 2" fatto } ar = (abc) prova ar – johndir

+1

uso 'per pkg in "$ {! ref}"', altrimenti il ​​ciclo sarà fragile rispetto agli spazi in serie elementi (ad esempio 'ar = (a" bc "d)'). –

+0

@glenn jackman: distaccato – ata

2

ar non è il primo parametro di prova - È tutti i parametri. Dovrai echo "[email protected]" nella tua funzione.

+0

Bene, questo non è quello che originariamente previsto, ma ha fatto il trucco: test() {var per in "$ @"; fare echo "1 $ var 2" fatto } ar = (abc) prova $ {ar [@]} – johndir

5

mi rendo conto questa domanda è quasi due anni, ma mi ha aiutato verso capire la risposta reale alla domanda iniziale, che nessuna delle risposte di cui sopra effettivamente fare (@ata e risposte @ di l0b0). La domanda era "Come passare un array a una funzione di bash?", Mentre @ata era vicino a farlo bene, il suo metodo non finisce con un vero array da usare all'interno della funzione stessa. È necessaria una piccola aggiunta.

Quindi, supponendo che avevamo anArray=(a b c d) da qualche parte prima funzione do_something_with_array() chiamare, questo è il modo vorremmo definire la funzione:

function do_something_with_array { 
    local tmp=$1[@] 
    local arrArg=(${!tmp}) 

    echo ${#arrArg[*]} 
    echo ${arrArg[3]} 
} 

Ora

do_something_with_array anArray 

Sarebbe trasmesso correttamente:

4 
d 

Se esiste la possibilità di alcuni elementi della tua ar raggio può contenere spazi, è necessario impostare IFS su un valore diverso da SPACE, quindi tornare indietro dopo aver copiato gli array dell'array della funzione negli array locali. Ad esempio, utilizzando il sopra:

local tmp=$1[@] 
prevIFS=$IFS 
IFS=, 
local arrArg=(${!tmp}) 
IFS=$prevIFS 
Problemi correlati