arrays bash pointers key associative-array

arrays - Bash referencia indirecta a una matriz asociativa



pointers key (3)

Desde Bash 4.3, declare tiene un indicador -n para definir las referencias (esto es vagamente equivalente a las referencias en C ++). Esta bandera simplifica tremendamente su problema aquí:

fullname() { declare -nl pointer="$1" for i in "${!pointer[@]}" do echo "${pointer[$i]} $i" done }

Será seguro si tiene espacios o símbolos divertidos en las teclas de su hash (a diferencia de la respuesta aceptada).

En este ejemplo muy simplificado, necesito abordar tanto la clave como el valor de un elemento de matriz:

declare -A writer writer[H.P.]=Lovecraft writer[Stephen]=King writer[Clive]=Barker writer[Jack]=Ketchum for i in ${!writer[@]} do echo "$i ${writer[$i]}" done fullname() { pointer=$1[@] for i in "${!pointer}" do echo "? $i" done } fullname writer

La función debe mostrar el resultado en el mismo formato que el bucle de ejemplo anterior, y debe recibir ya sea el nombre de la matriz, la lista de claves o los valores, todos los cuales probé, sin éxito. Cualquier sugerencia es bienvenida.


indir_keys() { eval "echo /${!$1[@]}" } indir_val() { eval "echo /${$1[$2]}" } fullname() { pointer=$1 for i in $(indir_keys $pointer) do echo "$i $(indir_val $pointer $i)" done }

Da:

Jack Ketchum Clive Barker Stephen King H.P. Lovecraft


De la guía de referencia Bash :

Los parámetros posicionales se reemplazan temporalmente cuando se ejecuta una función de shell (ver Funciones de Shell ).

Entonces podrías hacer esto:

fullname() { for first do echo "$first ${writer[$first]}" done } fullname "${!writer[@]}"