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


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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.