¿expansión variable indirecta en POSIX como se hace en bash?

11

¿Es posible, o hay algún truco elegante para hacer una expansión variable indirecta en POSIX como se puede hacer en Bash?

Por contexto, estoy tratando de hacer lo siguiente:

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

EDITAR: Para aclarar, me gustaría acceder a las variables de shell que comienzan con map_.

Rayado
fuente
55
Votado para volver a abrir. La Q quiere saber cómo obtener indirectamente todas las variables que coinciden con el comodín ( map_*).
slm
Me sorprendió que estaba claro en lo que respecta a mi pregunta: P
Dashed
44
Por favor, vuelva a abrir. Es un caso de shVS bash: consulte stackoverflow.com/a/5725402/1172302 .
Nikos Alexandris
Por eso, a algunas personas no les gusta stackoverflow y algunos sitios de intercambio de pila.
Dashed

Respuestas:

6

El truco es usar 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
fuente
¡Gracias! setera lo que estaba buscando
Dashed
Sin embargo, eso no es infalible y es una vulnerabilidad de inyección de comandos arbitraria (como cuando se ejecuta en un entorno que sí lo tiene QUERYSTRING=$'\nmap_$(reboot)=x'). También tenga en cuenta que el bashshell incluye la lista de funciones en la salida de set(cuando no se ejecuta como sh).
Stéphane Chazelas