ตัวแปร Shell เทียบกับตัวแปรสภาพแวดล้อม
MY_HOME="/home/my_user"
กำหนดตัวแปรเปลือกMY_HOME
ที่เรียกว่า เชลล์เป็นภาษาโปรแกรมและมีตัวแปร (เรียกอีกอย่างว่าพารามิเตอร์) echo "$MY_HOME"
หลังจากที่ได้รับมอบหมายนี้คุณสามารถใช้ค่าของตัวแปรเช่นกับ
ตัวแปรของเชลล์เป็นแนวคิดของเชลล์ภายใน เมื่อเชลล์อินสแตนซ์นั้นสิ้นสุดลงMY_HOME
จะถูกลืม สิ่งที่ทุกโปรแกรมรู้เกี่ยวกับและส่งให้กับเด็กที่เป็นตัวแปรสภาพแวดล้อม
ภายในเชลล์ตัวแปรสภาพแวดล้อมและตัวแปรเชลล์ทำงานในลักษณะที่คล้ายกันมาก สิ่งที่เกิดขึ้นจริงคือตัวแปรสภาพแวดล้อมทั้งหมดที่เชลล์สืบทอดจากพาเรนต์กลายเป็นตัวแปรเชลล์ ตรงกันข้ามตัวแปรเปลือกที่กำหนดไว้ในสคริปต์เปลือกจะกลายเป็นตัวแปรสภาพแวดล้อมถ้าคุณส่งออกมัน
export MY_HOME="/home/my_user"
รายละเอียดเพิ่มเติมที่คุณสามารถข้ามไปอ่านครั้งแรก
เหตุผลที่ตัวแปรเชลล์ไม่ได้กลายเป็นตัวแปรสภาพแวดล้อมโดยอัตโนมัติเป็นส่วนหนึ่งที่สคริปต์อาจใช้ชื่อตัวแปรที่มีความหมายกับโปรแกรมที่เปิดตัวโดยไม่ได้ตั้งใจ
เชลล์เก่ามากบางอันจำเป็นต้องexport
ใช้ทุกครั้งที่คุณเปลี่ยนชื่อตัวแปร แต่เชลล์สมัยใหม่ทั้งหมดติดตามการกำหนดค่าสำหรับตัวแปรสภาพแวดล้อมเพื่อให้สนิปเพตดังต่อไปนี้สะท้อนbar
:
myvar=foo
export myvar
myvar=bar
env | grep '^myvar='
นอกจากนี้บางหอยเก่ามากจำเป็นต้องใช้คำสั่งที่แยกต่างหากสำหรับmyvar=foo
และแต่ทั้งหมดเปลือกหอยที่ทันสมัยเข้าใจexport myvar
export myvar=foo
คุณสามารถรันset -a
เพื่อทำการมอบหมายตัวแปรเชลล์ทั้งหมดโดยอัตโนมัติเอ็กซ์พอร์ตตัวแปรดังนั้นนั่นmyvar=foo
เท่ากับexport myvar=foo
ถ้าคุณรันset -a
ในเชลล์นั้นก่อน
เมื่อพูดถึง
การอ้างอิงส่วนใหญ่จะเป็นมุมฉาก หากค่าที่คุณกำหนดให้กับตัวแปรไม่มีอักขระใด ๆ ที่พิเศษสำหรับเชลล์คุณไม่จำเป็นต้องใส่เครื่องหมายอัญประกาศ หากมีอักขระพิเศษคุณต้องป้องกันด้วยเครื่องหมายคำพูดเดี่ยวหรือเครื่องหมายคำพูดคู่หรือแบ็กสแลชหรือการรวมกัน สิ่งนี้จะเกิดขึ้นกับทั้งmyvar=value
ไวยากรณ์ธรรมดาและexport
ยูทิลิตี้
มีความแตกต่างอย่างหนึ่งระหว่างไวยากรณ์การมอบหมายและexport
ไวยากรณ์ เชลล์จะขยายผลลัพธ์ของการแทนที่ตัวแปร$foo
เพิ่มเติมโดยดำเนินการแยกฟิลด์ (คำ)และการขยายชื่อพา ธ (การวนซ้ำ) ซึ่งหมายความว่าหากค่าของmyvar
คือhello *
ให้echo $myvar
พิมพ์hello
ตามด้วยช่องว่างเดียวตามด้วยรายการไฟล์ในไดเรกทอรีปัจจุบัน นี้เกือบจะไม่เป็นที่น่าพอใจจึงหลักการทั่วไปมักจะใช้คำพูดสองรอบแทนตัวแปร (ยกเว้นกรณีที่คุณรู้ว่าคุณจำเป็นต้องพา ธ echo "$myvar"
การขยายตัวหรือแยกเขต): ในกรณีของการมอบหมายอย่างง่ายothervar=$myvar
ในความเป็นจริงเชื่อถือได้คัดลอกค่าของmyvar
ถึงothervar
เนื่องจาก globbing และการแบ่งคำถูกยับยั้งในการมอบหมาย (เพราะพวกเขาสร้างหลายคำ แต่คาดว่าจะมีคำเดียว) การยกเว้นนี้ไม่ได้นำไปใช้export
อย่างไร ดังนั้นหากคุณต้องการจดจำกฎง่ายๆให้ใช้เครื่องหมายคำพูดคู่ล้อมรอบการแทนที่ตัวแปรเสมอ