expansion variable indirecte dans POSIX comme fait dans bash?

11

Est-il possible, ou existe-t-il un hack élégant pour faire une expansion de variable indirecte dans POSIX comme cela peut être fait dans Bash?

Pour le contexte, j'essaie de faire ce qui suit:

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

EDIT: Pour clarifier, je voudrais accéder aux variables shell qui commencent par map_.

Dashed
la source
5
A voté pour rouvrir. Le Q veut savoir comment obtenir indirectement, toutes les variables qui correspondent au caractère générique ( map_*).
slm
J'ai été surpris de ne pas être clair en ce qui concerne ma question: P
Dashed
4
Veuillez rouvrir. C'est un cas de shVS bash- voir stackoverflow.com/a/5725402/1172302 .
Nikos Alexandris
C'est pourquoi certaines personnes n'aiment pas stackoverflow et certains sites stackexchange.
Dashed

Réponses:

6

Le hack consiste à utiliser 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
la source
Merci! setétait ce que je cherchais.
Dashed
Ce n'est cependant pas infaillible et c'est une vulnérabilité d'injection de commande arbitraire (comme lorsqu'il est exécuté dans un environnement qui l'a QUERYSTRING=$'\nmap_$(reboot)=x'). Sachez également que le bashshell inclut la liste des fonctions dans la sortie de set(lorsqu'il ne s'exécute pas en tant que sh).
Stéphane Chazelas