2012-05-29 26 views
20

Las matrices asociativas parecen ser locales por defecto cuando se declaran dentro de un cuerpo de función, donde deberían ser globales. El códigoLas matrices asociativas son locales de forma predeterminada

#!/bin/bash 

f() { 
    declare -A map 
    map[x]=a 
    map[y]=b 
} 

f 
echo x: ${map[x]} y: ${map[y]} 

siguiente produce la salida:

x: y: 

mientras este

#!/bin/bash 

declare -A map 

f() { 
    map[x]=a 
    map[y]=b 
} 

f 
echo x: ${map[x]} y: ${map[y]} 

produce la salida:

x: a y: b 

¿Es posible declarar una matriz asociativa global dentro de una función? ¿O qué solución alternativa se puede utilizar?

Respuesta

16

De: Greg woolEdge
Enviado: Mar 23 Agos 2011 06:53:27 -0700
Asunto: Re: YAQAGV (otra pregunta sobre variables globales)

fiesta 4.2 añade "declarar -g "para crear variables globales desde una función .

Gracias Greg! Sin embargo Debian Squeeze todavía tiene Bash 4.1.5

+0

'declaran -g' también trabajará en zsh :) – AdrieanKhisbe

5

Ya ha respondido su propia pregunta con declare -g. La solución en las versiones de bash < 4.2 es declarar la matriz fuera de la función.

f() { 
    map[y] = foo 
} 

declare -A map 
foo 
echo "${map[y]}" 
+0

Esa opción se muestra explícitamente en mi propio ejemplo. Sin embargo, no funciona cuando necesita 'desarmar' y luego 'declarar' la misma variable dentro de una función. Pero aún así, existe una solución alternativa para Bash <4.2 y consiste en "hacer eco de la declaración de la variable desde el interior de la función a una 'evaluación' externa con acceso al entorno principal. – davide

3

fina, 4.2 añade "declarar -g" pero es con errores de matrices asociativas por lo que (todavía) no responde a la pregunta. Aquí está mi informe de errores y la confirmación de Chet de que hay una solución programada para la próxima versión.

http://lists.gnu.org/archive/html/bug-bash/2013-09/msg00025.html

pero he encontrado por casualidad una solución, en lugar de declarar la matriz y la asignación de un valor inicial a ella, al mismo tiempo, en primer lugar declarar la matriz y luego hacer la tarea. Es decir, no hacen esto:

declare -gA a=([x]=1 [y]=2) 

pero esta vez:

declare -gA a; a=([x]=1 [y]=2) 
Cuestiones relacionadas