непряме розширення змінної в POSIX, як це робиться в bash?


11

Чи можливо, чи є якийсь елегантний хак, щоб зробити непряме розширення змінної в POSIX, як це можна зробити в Bash?

Для контексту я намагаюся зробити наступне:

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

EDIT: Щоб уточнити, я хотів би отримати доступ до змінних оболонок, які починаються з map_.


5
Проголосували за повторне відкриття. Q хоче знати, як отримати опосередковано всі змінні, які відповідають підстановці ( map_*).
slm

Я був здивований, що мені було незрозуміло щодо мого запитання: P
Dashed

4
Будь ласка, знову відкрийте. Це справа shVS bash- див. Stackoverflow.com/a/5725402/1172302 .
Нікос Олександріс

Ось чому деякі люди не люблять stackoverflow та деякі stackexchange сайти.
Пунктирний

Відповіді:


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.