2012-05-29 3 views
20

Tablice asocjacyjne wydają się domyślnie lokalne, gdy są zadeklarowane w treści funkcji, gdzie powinny być globalne. Poniższy kodTablice asocjacyjne są domyślnie lokalne.

#!/bin/bash 

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

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

produkuje wyjście:

x: y: 

podczas tego

#!/bin/bash 

declare -A map 

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

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

produkuje wyjście:

x: a y: b 

Czy można zadeklarować globalną tablicę asocjacyjną w ramach funkcji? A jakie rozwiązania można zastosować?

Odpowiedz

16

Od: Greg Wooledge
Wysłane: Tue, 23 sierpnia 2011 06:53:27 -0700
Temat: Re: YAQAGV (Yet Another pytanie o zmienne globalne)

bash 4.2 dodaje: „Oświadczam -g "do tworzenia globalnych zmiennych z poziomu funkcji .

Dziękuję Greg! Jednak Debian Squeeze nadal ma Bash 4.1.5

+0

'zadeklarować -g' będzie również działać na zsh :) – AdrieanKhisbe

5

Odpowiedziałeś już na własne pytanie zgłoś -g. Obejściem wersji basha < 4.2 jest zadeklarowanie tablicy poza funkcją.

f() { 
    map[y] = foo 
} 

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

że opcja ta jest wyraźnie pokazane na własnym przykładzie. Nie działa to jednak, gdy trzeba "wyzerować", a następnie "zadeklarować" tę samą zmienną wewnątrz funkcji. Wciąż jednak istnieje obejście Bash <4.2 i polega ono na "odbiciu deklaracji zmiennej z wewnątrz funkcji na zewnętrzny" eval "z dostępem do głównego środowiska. – davide

3

dzieła, 4.2 dodaje: „Oświadczam -g” ale to buggy dla asocjacyjnych więc to nie jest (jeszcze) odpowiedzi na pytanie. Oto mój raport o błędzie i potwierdzenie Cheta, że ​​jest zaplanowana poprawka na kolejną wersję.

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

Ale ja nieoczekiwanie znaleźli obejście, zamiast deklarowania tablicy i przypisanie wartości początkowej do niego w tym samym czasie, najpierw zadeklarować tablicę, a następnie wykonaj zadania. Oznacza to, że tego nie zrobi:

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

ale zamiast tego:

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