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


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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.