Vi un truco para implementar matrices asociativas en un script de shell. Por ejemplo, print array["apples"]
podría escribirse como echo \$array$key
where key = apples.
Sin embargo, no se mencionó cómo generar las claves para iterar sobre la matriz. La única forma en que podía pensar era almacenar las claves en una variable delimitada por espacios para poder usar un bucle for para iterar sobre la matriz.
Entonces, ¿hay alguna otra forma de almacenar las claves para su uso posterior?
shell-script
associative-array
Intelectual
fuente
fuente
Respuestas:
Conchas con matrices asociativas
Algunos shells modernos proporcionan matrices asociativas: ksh93, bash ≥4, zsh. En ksh93 y bash, si
a
es una matriz asociativa, entonces"${!a[@]}"
es la matriz de sus claves:En zsh, esa sintaxis solo funciona en el modo de emulación ksh. De lo contrario, debe usar la sintaxis nativa de zsh:
${(k)a}
También funciona sia
no tiene una clave vacía.En zsh, también puede hacer un bucle en
k
eys yv
alues al mismo tiempo:Conchas sin matrices asociativas
Emular matrices asociativas en shells que no las tienen es mucho más trabajo. Si necesita matrices asociativas, probablemente sea hora de traer una herramienta más grande, como ksh93 o Perl.
Si necesita matrices asociativas en un simple shell POSIX, aquí hay una manera de simularlas, cuando las claves están restringidas para contener solo los caracteres
0-9A-Z_a-z
(dígitos ASCII, letras y guiones bajos). Bajo este supuesto, las claves pueden usarse como parte de nombres de variables. Las funciones a continuación actúan sobre una matriz identificada por un prefijo de denominación, la "raíz", que no debe contener dos guiones bajos consecutivos.(Advertencia, código no probado. No se proporciona detección de errores para claves y tallos sintácticamente inválidos).
fuente
No estoy seguro de lo que quiere decir con tienda, pero puede iterar sobre las claves usando la
${!array[@]}
sintaxis:Entonces, para iterar:
Encontré un bonito y breve tutorial sobre esto aquí .
Como se señala en los comentarios a continuación, se agregaron matrices asociativas en la
bash
versión 4. Vea aquí un artículo de la revista Linux sobre el tema.fuente
(bash version 4 only)
Eso es algo importante a tener en cuenta. Tradicionalmente, lasbash
matrices son solo numéricas.typeset
lugar dedeclare
en sus ejemplos. Eso los haría portátiles entre bash 4 y ksh93, que primero implementó matrices asociativas de shell.Conchas sin matrices asociativas
No es tan difícil cuando las teclas están restringidas a
[0-9A-Za-z_]
(números, letras, guiones bajos).El truco es en lugar de almacenar en la matriz [ $ clave ], almacenar en las variables matriz_ $ clave .
Conjunto:
Obtener:
Nota: Los valores no pueden contener
'
(comillas simples).fuente
esto funciona en bash
O
No es necesario usar eval afaik
fuente