เมื่อเชลล์วิเคราะห์คำบรรทัดมันจะทำเครื่องหมายบรรทัดเป็นคำให้ดำเนินการขยายคำสั่งต่าง ๆ (ตามลำดับ) จากนั้นดำเนินการคำสั่ง
สมมติ test=1:2:3:4:5:6
ลองดูคำสั่งนี้: IFS=":" read a b c d e f <<< "$test"
หลังจาก tokenizing และการขยายพารามิเตอร์เกิดขึ้น:IFS=":"
read
a
b
c
d
e
f
<<<
"1:2:3:4:5:6"
เชลล์จะตั้งค่าตัวแปร IFS สำหรับช่วงเวลาของคำสั่ง read และread
รู้วิธีใช้ $ IFS กับอินพุตและให้ค่ากับชื่อตัวแปร
คำสั่งนี้มีเรื่องราวที่คล้ายกัน แต่ผลลัพธ์ที่แตกต่าง: HOME="hello" echo "$HOME"
เนื่องจากการขยายพารามิเตอร์เกิดขึ้นก่อนที่คำสั่งจะเริ่มเชลล์มี:
HOME="hello" echo "/home/username"
จากนั้นในระหว่างการดำเนินการคำสั่ง echo ค่าใหม่ของ $ HOME จะไม่ถูกใช้เลย
เพื่อให้บรรลุสิ่งที่คุณพยายามจะทำให้เลือกข้อใดข้อหนึ่ง
# Delay expansion of the variable until its new value is set
HOME="hello" eval 'echo "$HOME"'
หรือ
# Using a subshell, so the altered env variable does not affect the parent.
# The semicolon means that the variable assignment will occur before
# the variable expansion
(HOME="hello"; echo "$HOME")
แต่อย่าเลือกอันแรก
local
ทางออกก็คือการห่อไว้ในฟังก์ชั่นและการใช้งาน