Considere que tengo una matriz muy grande $large_list
, ¿hay alguna manera de escribir una función que tome la matriz como argumento? Por ejemplo:
echo_idx_array () {
arr="$1"
idx="$2"
echo "${arr[$idx]}"
}
¿Cuál es la estrategia habitual para hacer algo así? Intenté dar la variable $large_list
pero estaba vacía.
Estoy dispuesto a modificar la función para adaptarla a cualquier cambio en la lista de argumentos.
Para el registro, estoy usando ksh88, y estoy buscando respuestas lo más portátiles posible.
EDITAR : Hasta ahora, lo mejor que se me ocurre es recorrer la matriz y enviar cada elemento como argumento a la función. Esto parece increíblemente feo y propenso a errores, sin mencionar que seguramente alcanzará algún límite rápidamente. Esto es lo que hice:
foo () {
echo $*
}
cmd="foo "
while [[ $i -lt $MAX_ARR_SIZE ]]; do
cmd="$cmd ${large_list[$i]}"
((i=i+1))
done
eval $cmd
¿No hay algo mejor que hacer?
func "${array[@]}"
? Si solo necesita pasar un elemento, simplemente pase el elemento; no es necesario hacerlo más complicado al pasar una matriz y un índice."${array[$@]}
. Su sugerencia realmente funciona. Mea culpa.Respuestas:
Para pasar los elementos de la matriz como argumentos a la función, use la sintaxis ksh para expandir los elementos de la matriz como una lista.
El
[@]
sufijo lo convierte en una expansión de matriz. Las comillas dobles protegen a cada elemento de una mayor expansión (división y globalización). El resultado de la expansión no es, en general, una palabra como suele ser con comillas dobles, sino tantas palabras como elementos en la matriz.El N -ésimo elemento de la matriz es entonces . Para acceder a él, debe usar ; ver Usar una referencia de variable "dentro" de otra variable
${N}
eval
fuente
myarray=("hello world" wibble)
(2 elementos, el primero de los cuales contiene un espacio):work_on_array "${myarray[@]}"
pasa 2 parámetroshello world
ywibble
;work_on_array ${myarray[@]}
pases 2 parámetroshello
,world
ywibble
. Y conmyarray=(*)
,work_on_array ${myarray[@]}
pasa la lista de archivos en el directorio actual. (Por lo tanto, este es uno de los muchos casos en los que mi consejo hace una diferencia práctica.)hello
,world
ywibble
hace 3 parámetros.)Hay una manera en bash 4.3+, que probablemente proviene de ksh:
Ver también
declare -n
.fuente
Depende del Korn Shell ... las versiones recientes de AT&T ksh93 y mksh lo admiten:
En mi shell actual, esto produce la salida "b".
fuente