expansão variável indireta no POSIX como feita no bash?


11

É possível ou existe algum truque elegante para fazer a expansão variável indireta no POSIX, como pode ser feito no Bash?

Por contexto, estou tentando fazer o seguinte:

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

Edição: Para esclarecer, eu gostaria de acessar variáveis ​​de shell que começam com map_.


5
Votou para reabrir. O Q quer saber como obter indiretamente todas as variáveis ​​que correspondem ao curinga ( map_*).
slm

Fiquei surpreso por não ter certeza sobre a minha pergunta: P
tracejado

4
Por favor, reabra. É um caso de shVS bash- consulte stackoverflow.com/a/5725402/1172302 .
Nikos Alexandris

Portanto, é por isso que algumas pessoas não gostam de stackoverflow e alguns sites de stackexchange.
tracejado

Respostas:


6

O truque é 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

Obrigado! setera o que eu estava procurando.
tracejado

No entanto, isso não é infalível e é uma vulnerabilidade arbitrária à injeção de comandos (como quando é executada em um ambiente que possui QUERYSTRING=$'\nmap_$(reboot)=x'). Lembre-se também de que o bashshell inclua a lista de funções na saída de set(quando não estiver sendo executado como sh).
Stéphane Chazelas 01/08/19
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.