indirekte Variablenerweiterung in POSIX wie in Bash?

10

Ist es möglich oder gibt es einen eleganten Hack, um eine indirekte Variablenerweiterung in POSIX durchzuführen, wie dies in Bash möglich ist?

Für den Kontext versuche ich Folgendes zu tun:

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

EDIT: Zur Verdeutlichung möchte ich zunächst auf Shell-Variablen zugreifen map_.

Gestrichelt
quelle
5
Zur Wiedereröffnung gewählt. Das Q möchte wissen, wie indirekt alle Variablen abgerufen werden, die mit dem Platzhalter ( map_*) übereinstimmen .
slm
Ich war überrascht, dass ich in Bezug auf meine Frage unklar war: P
Dashed
4
Bitte wieder öffnen. Es handelt sich um shVS bash- siehe stackoverflow.com/a/5725402/1172302 .
Nikos Alexandris
Aus diesem Grund mögen einige Leute Stackoverflow und einige Stackexchange-Sites nicht.
Gestrichelt am

Antworten:

6

Der Hack ist zu verwenden 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
quelle
Vielen Dank! setwar das, wonach ich gesucht habe.
Gestürzt
Dies ist jedoch nicht kinderleicht und stellt eine willkürliche Sicherheitsanfälligkeit bezüglich Befehlsinjektion dar (z. B. wenn es in einer Umgebung ausgeführt wird, in der dies der Fall ist QUERYSTRING=$'\nmap_$(reboot)=x'). Beachten Sie auch, dass die bashShell die Liste der Funktionen in der Ausgabe von enthält set(wenn sie nicht als ausgeführt wird sh).
Stéphane Chazelas