pośrednie rozszerzanie zmiennych w POSIX-ie w bash?

11

Czy jest to możliwe, czy jest jakiś elegancki hack, aby dokonać pośredniej rozbudowy zmiennych w POSIX, jak można to zrobić w Bash?

W kontekście próbuję wykonać następujące czynności:

for key in ${!map_*}
do
    # do something
done

EDYCJA: Aby to wyjaśnić, chciałbym uzyskać dostęp do zmiennych powłoki, które zaczynają się od map_.

Przeklęty
źródło
5
Zagłosowano ponownie otworzyć. Q chce wiedzieć, jak uzyskać pośrednio wszystkie zmienne pasujące do znaku wieloznacznego ( map_*).
slm
Byłem zaskoczony, że nie byłem pewien, co do mojego pytania: P
Dashed
4
Proszę ponownie otworzyć. Jest to przypadek shVS bash- patrz stackoverflow.com/a/5725402/1172302 .
Nikos Alexandris,
Dlatego niektórzy ludzie nie lubią nakładania się stosów i niektórych stron wymiany stosów.
Dashed

Odpowiedzi:

6

Hack polega na użyciu eval:

aaa=1
aab=2
aac=3

eval_like() {
    pattern=$1
    vars=`set |grep "^$pattern.*=" | cut -f 1 -d '='`
    for v in $vars; do
        eval vval="\$$v"
        echo $vval
    done
}   

for i in `eval_like aa`; do
    echo $i
done
Zaar Hai
źródło
Dzięki! settego szukałem.
Dashed
Nie jest to jednak niezawodne i stanowi lukę w zabezpieczeniach polegającą na wstrzykiwaniu dowolnych poleceń (na przykład w środowisku, w którym działa QUERYSTRING=$'\nmap_$(reboot)=x'). Uważaj również, aby bashpowłoka zawiera listę funkcji na wyjściu set(gdy nie działa jako sh).
Stéphane Chazelas