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_listpero 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}evalfuente
myarray=("hello world" wibble)(2 elementos, el primero de los cuales contiene un espacio):work_on_array "${myarray[@]}"pasa 2 parámetroshello worldywibble;work_on_array ${myarray[@]}pases 2 parámetroshello,worldywibble. 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,worldywibblehace 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