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
fonte
2013-09-04 02:10:49
Va bene, che funziona: test() { locale ref = $ 1 [@] per pkg in $ {! ref}; do echo "1 $ pkg 2" fatto } ar = (abc) prova ar – johndir
uso 'per pkg in "$ {! ref}"', altrimenti il ciclo sarà fragile rispetto agli spazi in serie elementi (ad esempio 'ar = (a" bc "d)'). –
@glenn jackman: distaccato – ata