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

Tracejadas
fonte
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
Zaar Hai
fonte
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