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