การทำความเข้าใจและการเขียน 'ตัวแปร Linux' ในการเขียนสคริปต์เชลล์ - ตอนที่ 10
ภาษาสคริปต์เชลล์ของ Linux เป็นประเด็นร้อนมาโดยตลอดและจะเป็นประเด็นร้อนในอนาคตตลอดไป ภาษาสคริปต์ของเชลล์นั้นมหัศจรรย์มาก และมันง่ายมากที่จะทำโปรแกรมในภาษาสคริปต์เหมือนกับภาษาอื่นๆ อย่างไรก็ตาม จำเป็นต้องมีความรู้เชิงลึกเกี่ยวกับสิ่งที่เรากำลังทำและผลลัพธ์ที่คาดหวัง
บทความเชลล์สคริปต์ทั้งหมดที่เราเขียนให้กับผู้อ่านของเราได้รับการชื่นชมอย่างสูง รวมถึงบทความล่าสุด “An Insight of Linux Variables” เรากำลังขยายบทความสุดท้ายไปสู่ระดับใหม่
คุณลักษณะของตัวแปร
ตัวแปรแต่ละตัวในสภาพแวดล้อม Linux มีตัวเลือกที่แน่นอน และตัวเลือกเหล่านั้นเรียกว่า 'คุณสมบัติ' ตัวเลือกหรือคุณลักษณะเหล่านี้สามารถ เปิด และ ปิด ได้เมื่อจำเป็นตามสถานการณ์โดยใช้คำสั่ง "ประกาศ "
ตัวอย่างของแอตทริบิวต์ตัวแปรใช้สวิตช์พูดว่า '-i' ซึ่งจะเปิดแอตทริบิวต์จำนวนเต็มสำหรับตัวแปรที่เกี่ยวข้อง แม้ว่าค่าที่ไม่ใช่ตัวเลขจะถูกส่งไปเพื่อสลับ '-i' ก็จะไม่แสดงข้อความแสดงข้อผิดพลาดและเอาต์พุต '0' เป็นการตีความจำนวนเต็ม จากตัวอย่างด้านล่างนี้จะชัดเจนยิ่งขึ้น
ประกาศตัวแปรจำนวนเต็ม บิล=121
avi@localhost:~$ declare -i bill=121
พิมพ์ค่าของบิลตัวแปร
avi@localhost:~$ printf "%d\n" "$bill"
121
ให้ค่าตัวแปรเป็นสตริง ประกาศบิลตัวแปรแล้ว ไม่ต้องประกาศครั้งที่สอง เพียงเปลี่ยนค่าของตัวแปรเป็น
avi@localhost:~$ bill=tecmint
ทีนี้ ให้พิมพ์ค่าของบิลตัวแปรอีกครั้ง
avi@localhost:~$ printf "%d\n" "$bill"
0
สังเกต '0' ในตำแหน่งข้อความแสดงข้อผิดพลาด
คำถามคือ จะทราบคุณลักษณะของตัวแปรที่ประกาศไว้แล้วได้อย่างไร
avi@localhost:~$ declare -p bill
declare -i bill="121"
ที่นี่สวิตช์ -p (ย่อมาจากการพิมพ์) มาเพื่อช่วยเหลือ
ฉันควรทำอย่างไรเพื่อปิดคุณลักษณะของตัวแปรอีกครั้ง
เพื่อที่จะปิด ปิด คุณลักษณะของตัวแปร สิ่งที่เราต้องการทั้งหมดคือการใส่เครื่องหมาย + (บวก) ก่อนสวิตช์ จากตัวอย่างด้านล่างนี้จะชัดเจนยิ่งขึ้น
สลับปิดแอตทริบิวต์จำนวนเต็มสำหรับตัวแปรด้านบน
avi@localhost:~$ declare +i bill
ตรวจสอบค่าของตัวแปร
avi@localhost:~$ printf "%d\n" "$bill"
bash: printf: bill: invalid number
0
ตอนนี้พิมพ์ค่าของตัวแปรโดยใช้สตริงสวิตช์
avi@localhost:~$ printf "%s\n" "$bill"
tecmint
ในตัวอย่างข้างต้น bash ไม่สามารถตัดสินค่าที่ไม่ใช่ตัวเลขว่าเป็นข้อผิดพลาด อย่างไรก็ตาม printf กำลังตีความ ค่าอะไรอาจเป็นตัวเลข และค่าอะไรไม่สามารถเป็นได้
ตัวแปรแบบอ่านอย่างเดียว
คุณอาจเคยได้ยิน Read Only Memory (ROM) แต่ Read-only Variable คืออะไร มันมีความคล้ายคลึงกับ ROM หรือไม่?
ตัวแปรแบบอ่านอย่างเดียว เช่น หน่วยความจำแบบอ่านอย่างเดียวคือค่าที่ไม่สามารถเปลี่ยนแปลงได้เมื่อถูกกำหนดแล้ว ดังนั้นจึงเรียกว่าอ่านอย่างเดียว คุณไม่สามารถเขียน แก้ไข หรือแก้ไขค่าใหม่สำหรับตัวแปรนั้นได้ นี่คือภาพประกอบโดยใช้ตัวอย่าง
Decalre ชื่อตัวแปรแบบอ่านอย่างเดียว (-r) ซึ่งมีค่าเป็น “linux-console.net ”
avi@localhost:~$ declare -r name="linux-console.net"
พิมพ์ค่าของตัวแปรที่ประกาศข้างต้น
avi@localhost:~$ printf "%s\n" "$name"
linux-console.net
ลองเปลี่ยนค่าของตัวแปร
avi@localhost:~$ declare -r name="Avishek"
bash: declare: name: readonly variable
ตามที่กล่าวไว้ข้างต้น คุณลักษณะของตัวแปรแบบอ่านอย่างเดียวสามารถเปลี่ยนได้โดยใช้เครื่องหมาย '+'
การส่งออกตัวแปรใน Linux
ตัวแปรเชลล์ทั้งหมดที่ประกาศในเชลล์สคริปต์จะพร้อมใช้งานจนกว่าสคริปต์จะทำงาน ภายนอกสคริปต์ไม่มีตัวแปรจากสคริปต์ กระบวนการทำให้ตัวแปรพร้อมใช้งานภายนอกสคริปต์เรียกว่าการส่งออกตัวแปร
ตัวแปรสามารถส่งออกนอกเชลล์ได้โดยใช้สวิตช์ ประกาศ -x (ส่งออก) ซึ่งรับทราบเชลล์สิ่งที่คุณต้องการส่งออก สวิตช์ประกาศส่งออกสามารถใช้เป็น
avi@localhost:~$ declare -x variable=”Constant_Value”
การเปลี่ยนแปลงทั้งหมดที่ทำกับตัวแปรในขณะที่สคริปต์กำลังทำงานอยู่ จะสูญหายไปเมื่อตัวแปรถูกส่งออกไปนอกสคริปต์ การส่งออกตัวแปรมีความสำคัญมากในการเขียนสคริปต์เชลล์
เราต้องการให้ตัวแปรที่ควรเป็นแบบอ่านอย่างเดียวและพร้อมใช้งานนอกสคริปต์ เราจำเป็นต้องใช้สวิตช์ -r และสวิตช์ -x ในเวลาเดียวกัน
avi@localhost:~$ declare -rx variable=”Constant_Value”
ตัวแปรสภาพแวดล้อม
ตัวแปรที่ใช้ร่วมกันระหว่างโปรแกรมและโปรแกรมที่รันตัวแปรเหล่านั้น สามารถส่งออกตัวแปรสภาพแวดล้อมได้ แต่ไม่สามารถกำหนดแอตทริบิวต์ให้กับตัวแปรได้
ทำความเข้าใจทฤษฎีข้างต้นในทางปฏิบัติ ที่นี่เรามีสองสคริปต์ 0.sh และ 1.sh
0.sh
#!/bin/bash
declare -rx name=Tecmint
bash 0.sh
exit 0
และสคริปต์ที่สองก็คือ
1.sh
#!/bin/bash
printf "%s\n" "$name"
name=linux-console.net
printf "%s\n" "$name"
exit 0
สิ่งที่เกิดขึ้นคือตัวแปร (ชื่อ) ถูกประกาศว่าเป็นแบบอ่านอย่างเดียวและส่งออก และทันทีหลังจากเรียกใช้สคริปต์ที่สองนั้น
สคริปต์ที่สองเพิ่งพิมพ์ตัวแปรจากสคริปต์แรกที่ส่งออกในคำสั่ง printf แรก ในคำสั่ง printf ที่สอง จะแสดงค่าใหม่ที่กำหนดให้กับตัวแปร 'name'
ไม่ต้องกังวลว่าตัวแปรเป็นแบบอ่านอย่างเดียว จะสามารถกำหนดใหม่ได้อย่างไร คุณจำไม่ได้ว่า “การเปลี่ยนแปลงทั้งหมดที่ทำกับตัวแปรในขณะที่สคริปต์กำลังทำงานอยู่ จะสูญหายไปเมื่อตัวแปรถูกส่งออกไปนอกสคริปต์ ”
อ้างอิง
คำสั่ง ประกาศ อนุญาตสวิตช์ทั้งหมดด้านล่างพร้อมกับการรวมกัน
- -a : ประกาศอาร์เรย์
- -f : ฟังก์ชั่นการแสดงผลและคำจำกัดความ
- -F : แสดงชื่อฟังก์ชัน
- -r : ประกาศตัวแปรเป็นแบบอ่านอย่างเดียว
- -x : ประกาศตัวแปรว่าสามารถส่งออกได้
- -I : ประกาศตัวแปรเป็นจำนวนเต็ม
นั่นคือทั้งหมดที่สำหรับตอนนี้. ในบทความถัดไป เราจะพูดถึงวิธีการแทนที่ตัวแปรโดยใช้คำสั่ง 'eval' และตัวแปรที่กำหนดไว้แล้วใน bash ก่อนที่จะปิดหัวข้อนี้ หวังว่าทุกคนจะเพลิดเพลินกับการเดินทางสู่การเขียนสคริปต์เชิงลึก จนกว่าจะคอยติดตามและเชื่อมต่อกับ linux-console.net