2011-01-03 12 views
25

Supongamos que tengo algunas matrices: bashDireccionamiento de matriz indirecta Bash?

A1=(apple trees) 
A2=(building blocks) 
A3=(color television) 

y el índice J=2, la forma de obtener el contenido de la matriz de A2?

+0

Esto es genial. Me considero un experto en bash y siempre he asumido que bash no puede hacer un direccionamiento indirecto como '$ {! Ind [@]}', pero nunca pensé en introducir una temp var para resolverlo. – SiegeX

+0

¡Pregunta/respuesta interesante! –

+0

Debe publicar su respuesta como respuesta. Podrás aceptarlo cuando expire el límite de tiempo. Aquí hay un ejemplo de la forma habitual en que las matrices se utilizan con direccionamiento indirecto: 'd = 13; e = 24; f = 35; a = (d e f); echo $ {! a [1]} 'que da como resultado" 24 ". –

Respuesta

21

ya he encontrado una solución, esto se puede hacer por:

$ Aref=A$J 
$ echo ${!Aref} 
building 
$ Aref=A$J[1] 
$ echo ${!Aref} 
blocks 
$ Aref=A$J[@] 
$ echo "${!Aref}" 
building blocks 
+2

¿Cómo se puede asignar a, por ejemplo, 'A $ J'? Necesita un nombre sin expansión para asignar, pero 'A $ J = (...)' no funciona. – musiphil

+0

esa es la letra "A" seguida de los contenidos de la variable "J". Si J == 2, entonces podría verlo como A + $ {J} == A2 –

+0

@musiphil, 'printf -v" A $ J "'% s'" valor para asignar "' hará el truco. Ver [BashFAQ # 6] (http://mywiki.wooledge.org/BashFAQ/006). –

17

Vale la pena señalar, que incluso un índice será sustituido en el tiempo se evalúa la variable:

$ A2=(building blocks) 
$ Aref=A2[index] 
$ index=1 
$ echo "${!Aref}" 
blocks 
+2

** FANTÁSTICO. ** años de shell scripting + leer el manual al menos una docena de veces + * intentos explícitos en exactamente esto * ¡no salió a la superficie esta pequeña joya! nota, al igual que los índices literales, ** cualquier expresión aritmética es válida, incluidas las expansiones anidadas **, p. ej. 'cycle = (0 1 2); ref = 'ciclo [i ++% $ {# ciclo [*]}]'; echo $ {! ref} $ {! ref} $ {! ref} $ {! ref} $ {! ref} $ {! ref} # => 0 1 2 0 1 2' – anthonyrisinger

+0

Me pregunto si esta es una característica explícitamente pretende serlo, o si estamos explotando el efecto secundario de la expansión indirecta, que podría desaparecer silenciosamente de lanzamientos futuros. – davide

+0

@anthonyrisinger esto es bastante interesante thx :) –

2
Hoy

(con fiesta de 4.3 y posteriores), lo mejor es utilizar el apoyo nameref:

A1=(apple trees) 
A2=(building blocks) 
A3=(color television) 
J=2 

declare -n A="A$J" 
printf '%q\n' "${A[@]}" 

... lo hará adecuadamente emitir:

building 
blocks 

Esto también está disponible como nameref A="A$J" en ksh93. Vea BashFAQ #6 para más detalles.

Cuestiones relacionadas