косвенное расширение переменной в 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).
Стефан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.