mở rộng biến gián tiếp trong POSIX như được thực hiện trong bash?


11

Có thể, hoặc có một số hack thanh lịch để thực hiện mở rộng biến gián tiếp trong POSIX như có thể được thực hiện trong Bash?

Đối với bối cảnh, tôi đang cố gắng làm như sau:

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

EDIT: Để làm rõ, tôi muốn truy cập các biến shell bắt đầu bằng map_.


5
Bình chọn để mở lại. Q muốn biết cách lấy gián tiếp, tất cả các biến khớp với ký tự đại diện ( map_*).
slm

Tôi đã ngạc nhiên khi tôi không rõ ràng về câu hỏi của mình: P
Đã vượt qua

4
Vui lòng mở lại. Đó là trường hợp của shVS bash- xem stackoverflow.com/a/5725402/1172302 .
Nikos Alexandris

Vì vậy, đây là lý do tại sao một số người không thích stackoverflow và một số trang web stackexchange.
Vượt qua

Câu trả lời:


6

Việc hack là sử dụng 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

Cảm ơn! setlà những gì tôi đang tìm kiếm.
Vượt qua

Điều đó không phải là hoàn hảo và là một lỗ hổng tiêm lệnh tùy ý (như khi nó chạy trong một môi trường có QUERYSTRING=$'\nmap_$(reboot)=x'). Cũng lưu ý rằng bashshell bao gồm danh sách các hàm trong đầu ra của set(khi không chạy dưới dạng sh).
Stéphane Chazelas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.