ekspansi variabel tidak langsung dalam POSIX seperti yang dilakukan dalam bash?

11

Apakah mungkin, atau adakah beberapa hack elegan untuk melakukan ekspansi variabel tidak langsung dalam POSIX seperti yang dapat dilakukan di Bash?

Untuk konteks, saya mencoba melakukan hal berikut:

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

EDIT: Untuk memperjelas, saya ingin mengakses variabel shell yang dimulai dengan map_.

Putus-putus
sumber
5
Memilih untuk membuka kembali. Q ingin tahu cara mendapatkan secara tidak langsung, semua variabel yang cocok dengan wildcard ( map_*).
slm
Saya terkejut saya tidak jelas sehubungan dengan pertanyaan saya: P
Dashed
4
Harap buka kembali. Ini adalah kasus shVS bash- lihat stackoverflow.com/a/5725402/1172302 .
Nikos Alexandris
Jadi inilah mengapa beberapa orang tidak suka stackoverflow dan beberapa situs stackexchange.
Gagal

Jawaban:

6

Peretasan adalah dengan menggunakan 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
sumber
Terima kasih! setadalah apa yang saya cari.
Gagal
Namun itu tidak mudah dan merupakan kerentanan injeksi perintah sewenang-wenang (seperti saat dijalankan di lingkungan yang memiliki QUERYSTRING=$'\nmap_$(reboot)=x'). Hati-hati juga bahwa bashshell menyertakan daftar fungsi dalam output set(saat tidak berjalan sebagai sh).
Stéphane Chazelas