ตัวแปร 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 myvarexport 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อย่างไร ดังนั้นหากคุณต้องการจดจำกฎง่ายๆให้ใช้เครื่องหมายคำพูดคู่ล้อมรอบการแทนที่ตัวแปรเสมอ