12

Estoy intentando crear una matriz asociativa multidimensional pero necesito ayuda. He revisado the page suggested in this SO answer pero me confundió aún más. Hasta el momento esto es lo que tengo:BASH: necesito ayuda con matrices asociativas multidimensionales

El guión:

#!/bin/bash 
declare -A PERSONS 
declare -A PERSON 
PERSON["FNAME"]='John' 
PERSON["LNAME"]='Andrew' 
PERSONS["1"]=${PERSON[@]} 
PERSON["FNAME"]='Elen' 
PERSON["LNAME"]='Murray' 
PERSONS["2"]=${PERSON[@]} 
for KEY in "${!PERSONS[@]}"; do 
TMP="${PERSONS["$KEY"]}" 
echo "$KEY - $TMP" 
echo "${TMP["FNAME"]}" 
echo "${TMP["LNAME"]}" 
done 

La salida:

1 - John Andrew 
John Andrew 
John Andrew 
2 - Elen Murray 
Elen Murray 
Elen Murray 

Como se puede ver tratando de acceder a un índice específico de la matriz $ TMP en el de loop devuelve toda la matriz.

[Q] ¿Qué debo hacer para acceder por separado a los índices "FNAME" y "LNAME" de la matriz $ TMP dentro del ciclo for?

Gracias.

Respuesta

20

No se puede hacer lo que estamos tratando de hacer: bash arrays son unidimensionales

$ declare -A PERSONS 
$ declare -A PERSON 
$ PERSON["FNAME"]='John' 
$ PERSON["LNAME"]='Andrew' 
$ declare -p PERSON 
declare -A PERSON='([FNAME]="John" [LNAME]="Andrew")' 
$ PERSONS[1]=([FNAME]="John" [LNAME]="Andrew") 
bash: PERSONS[1]: cannot assign list to array member 

Puede multidimensionalidad falsa componiendo una cadena índice de matriz adecuada:

declare -A PERSONS 
declare -A PERSON 

PERSON["FNAME"]='John' 
PERSON["LNAME"]='Andrew' 
i=1 
for key in "${!PERSON[@]}"; do 
    PERSONS[$i,$key]=${PERSON[$key]} 
done 

PERSON["FNAME"]='Elen' 
PERSON["LNAME"]='Murray' 
((i++)) 
for key in "${!PERSON[@]}"; do 
    PERSONS[$i,$key]=${PERSON[$key]} 
done 

declare -p PERSONS 
# ==> declare -A PERSONS='([1,LNAME]="Andrew" [2,FNAME]="Elen" [1,FNAME]="John" [2,LNAME]="Murray")' 
+0

Intenté su solución, pero eso no es lo que estoy buscando, ya que cuando recorro $ PERSONAS obtengo estos 4 elementos en el siguiente orden: "1, LNAME = Andrew", "2, FNAME = Elen", "1, FNAME = John" y "2, LNAME - Murray" con los que no puedo trabajar. Todavía estoy desconcertado sobre por qué bash no puede soportar matrices multidimensionales. Al final del día, todo lo que hago es asignar una variable (la matriz $ PERSON) a un elemento de la matriz ($ PERSONS ["X"]). ¿Por qué importaría el tipo de esta variable? ¿Verifica Bash y evita asignar una matriz a un elemento de matriz? – Max

+2

@ user359650, es una decisión de diseño de los desarrolladores de bash. Cito del manual de bash al que hice referencia: "Bash proporciona variables unidimensionales de matriz indexadas y asociativas". Lo que estás haciendo es asignar una cadena ("John Andrew") a un índice de matriz. Creo que debes volver a mirar lo que estás haciendo: si absolutamente debes tener matrices multidimensionales, estás usando la herramienta incorrecta para el trabajo. –

+1

Además, las matrices asociativas no tienen un orden particular. –

-2
#!/bin/bash 
declare -A PERSONS 
declare -A PERSON 
PERSON["FNAME"]='John' 
PERSON["LNAME"]='Andrew' 
PERSONS["1"]=${PERSON[@]} 
PERSON["FNAME"]='Elen' 
PERSON["LNAME"]='Murray' 
PERSONS["2"]=${PERSON[@]} 
for KEY in "${!PERSONS[@]}"; do 
TMP="${PERSONS["$KEY"]}" 
echo "$KEY - $TMP" 
**echo "${PERSON["FNAME"]}" 
echo "${PERSON["LNAME"]}**" 
done 

Debido a que la matriz original para los nombres separados todavía está activo y que todavía se puede hacer referencia dentro del bucle for.

+0

Lo siento, Don no entiendo tu solución No quiero acceder al array $ PERSON porque una vez que se han creado $ PERSONS ya no se debe acceder. – Max

+0

Disculpas - He leído mi solución y está equivocada, volveré más tarde – Raymondo

Cuestiones relacionadas