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


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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.