การขยายตัวแปรทางอ้อมใน POSIX เช่นเดียวกับในทุบตี?


11

เป็นไปได้หรือมีแฮ็กที่สง่างามที่จะทำการขยายตัวแปรทางอ้อมใน POSIX ที่สามารถทำได้ใน Bash?

สำหรับบริบทฉันพยายามทำสิ่งต่อไปนี้:

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

แก้ไข: map_ชี้แจงฉันต้องการที่จะเข้าถึงเปลือกตัวแปรที่ขึ้นต้นด้วย


5
โหวตให้เปิดใหม่ Q ต้องการทราบวิธีรับทางอ้อมตัวแปรทั้งหมดที่ตรงกับอักขระตัวแทน ( map_*)
slm

ฉันประหลาดใจที่ฉันไม่ชัดเจนเกี่ยวกับคำถามของฉัน: P
Dashed

4
กรุณาเปิดใหม่ มันเป็นกรณีของshVS bash- ดูstackoverflow.com/a/5725402/1172302
Nikos Alexandris

ดังนั้นนี่คือเหตุผลที่บางคนไม่ชอบ 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)
Stéphane Chazelas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.