${!FOO}
ทำการทดแทนสองครั้งในbash
ความหมายมันใช้ค่า (สตริง) ของ FOO และใช้มันเป็นชื่อตัวแปร
zsh
ไม่รองรับคุณสมบัตินี้
มีวิธีที่จะทำให้งานนี้ในเดียวกันbash
และzsh
?
พื้นหลัง:
ฉันมีรายการตัวแปรสภาพแวดล้อมเช่น
PATH MAIL EDITOR
และต้องการพิมพ์ชื่อตัวแปรก่อนหลังจากนั้นค่าของมัน
ใช้งานbash
ได้ แต่ไม่ใช่zsh
:
for VAR in LIST
do
echo $VAR
echo ${!VAR}
done
ควรเป็นไปได้ด้วย "วิธีเก่า" ด้วยeval
แต่ฉันไม่สามารถทำงาน:
for VAR in LIST
do
echo $VAR
echo `eval \$$VAR`
done
ฉันไม่เคยจะเข้าใจว่าทำไมฉันถึงไม่สามารถทำการทดแทนอย่างลึกซึ้งโดยพลการอย่างเช่น${${VAR}}
หรือแม้ว่า${${${VAR}}}
จำเป็นต้องมีดังนั้นคำอธิบายสำหรับสิ่งนั้นก็จะดีเช่นกัน
bash
มันมีฟังก์ชั่นเดียวกัน (และอีกมาก) ใช้รูปแบบที่แตกต่างกัน${(p)FOO}
เท่านั้น
(e)
สถานะการขยายพารามิเตอร์ของ zsh ถูกเพิ่มใน zsh-2.6-beta17 (พฤษภาคม 1996), (P)
ตั้งค่าสถานะใน 3.1.5-pws-7 (1999) bash's ${!var}
ใน 2.0 (ธันวาคม 1996)