косвенное расширение переменной в POSIX, как это сделано в Bash?

11

Возможно ли это, или есть какой-то элегантный способ взломать косвенное расширение переменных в POSIX, как это можно сделать в Bash?

Для контекста я пытаюсь сделать следующее:

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

РЕДАКТИРОВАТЬ: Чтобы уточнить, я хотел бы получить доступ к переменным оболочки, которые начинаются с map_.

Пунктирная
источник
5
Проголосовал за открытие. Q хочет знать, как получить косвенно все переменные, которые соответствуют шаблону ( map_*).
slm
Я был удивлен, что мне было неясно в отношении моего вопроса: P
разбит
4
Пожалуйста, откройте заново. Это случай shVS bash- см. Stackoverflow.com/a/5725402/1172302 .
Никос Александрис
Вот почему некоторые люди не любят stackoverflow и некоторые сайты обмена стеками.
разбито

Ответы:

6

Взломать это использовать 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
Заар Хай
источник
Спасибо! setбыло то, что я искал.
разбито
Это не защищает от ошибок и является уязвимостью к произвольному введению команд (например, когда она запускается в среде, которая имеет QUERYSTRING=$'\nmap_$(reboot)=x'). Также помните, что bashоболочка включает в себя список функций в выводе set(когда не работает как sh).
Стефан