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_.


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.