espansione variabile indiretta in POSIX come fatto in bash?


11

È possibile o esiste qualche hack elegante per eseguire l'espansione variabile indiretta in POSIX come si può fare in Bash?

Per il contesto, sto provando a fare quanto segue:

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

EDIT: Per chiarire, vorrei accedere alle variabili della shell che iniziano con map_.


5
Votato per riaprire. La Q vuole sapere come ottenere indirettamente, tutte le variabili che corrispondono al carattere jolly ( map_*).
slm

Fui sorpreso di non essere chiaro riguardo alla mia domanda: P
Tratteggiata il

4
Si prega di riaprire. È un caso di shVS bash- vedi stackoverflow.com/a/5725402/1172302 .
Nikos Alexandris,

Quindi questo è il motivo per cui alcune persone non amano StackOverflow e alcuni siti di StackExchange.
Tratteggiato il

Risposte:


6

L'hack è di usare 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

Grazie! setera quello che stavo cercando.
Tratteggiato il

Non è assolutamente infallibile ed è una vulnerabilità di iniezione di comando arbitraria (come quando viene eseguita in un ambiente che ha QUERYSTRING=$'\nmap_$(reboot)=x'). Nota anche che la bashshell include l'elenco delle funzioni nell'output di set(quando non è in esecuzione come sh).
Stéphane Chazelas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.