2011-11-10 15 views
12

¿Cómo paso una matriz a una función y por qué no funciona? Las soluciones en otras preguntas no me funcionaron. Para el registro, no necesito copiar la matriz así que no me importa pasar una referencia. Todo lo que quiero hacer es recorrerlo.Cómo pasar una matriz a una función 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 

Respuesta

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

test ar 
+0

Muy bien, eso funciona: test() { locales ref = $ 1 [@] para PKG en $ {! ref}; hacer echo "1 $ PKG 2" hecho } ar = (abc) prueba ar – johndir

+1

uso 'de PKG en "$ {! ref}"' o de lo contrario el bucle será frágil con respecto a los espacios en la matriz elementos (por ejemplo, 'ar = (a" bc "d)'). –

+0

@glenn jackman: secundó – ata

2

ar no es el primer parámetro a prueba - Es todos los parámetros. Tendrás que echo "[email protected]" en tu función.

+0

Bueno, esto no es lo que originalmente previsto, pero que sí hizo el truco: test() {var para en "$ @"; hacer echo "1 $ var 2" hecho } ar = (abc) prueba $ {ar [@]} – johndir

5

que dan cuenta de esta pregunta es casi dos años, pero me ayudó a averiguar la respuesta real a la pregunta original, que ninguna de las respuestas anteriores realmente hacen (@ata y respuestas de @ l0b0). La pregunta era "¿Cómo paso una matriz a una función bash?", Mientras @ata estaba cerca de hacerlo bien, su método no termina con una matriz real para usar dentro de la función misma. Se necesita una pequeña adición.

Así, suponiendo que teníamos anArray=(a b c d) algún lugar antes de la función do_something_with_array() llamar, así es como nos gustaría definir la función:

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

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

Ahora

do_something_with_array anArray 

de llevar correctamente la salida:

4 
d 

Si existe la posibilidad de que algunos elemento (s) de su ar ray puede contener espacios, debe establecer IFS en un valor que no sea SPACE, y luego de nuevo después de haber copiado arg (s) de la matriz de la función en matrices locales. Por ejemplo, mediante los métodos anteriores:

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