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


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

¡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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.