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[@]}"