ข้อมูลเชิงลึกของ Linux "ตัวแปร" ในภาษาเชลล์สคริปต์ - ตอนที่ 9
เราได้เขียนบทความหลายชุดเกี่ยวกับ Linux Shell Scripting ซึ่งได้รับการตอบรับอย่างอบอุ่นในครั้งนั้น และตอนนี้ก็มีความเกี่ยวข้องมากด้วย นี่คือลิงค์ไปยังชุดบทความเกี่ยวกับเชลล์สคริปต์
- เรียนรู้การเขียนสคริปต์เชลล์ Linux
ในบทความนี้ เราจะเห็น ตัวแปร การดำเนินการ และการนำไปใช้งานในเชลล์สคริปต์
การบันทึกเอาท์พุต
เอาต์พุตของคำสั่งสามารถเปลี่ยนเส้นทางไปยังเอาต์พุตมาตรฐานหรือไฟล์ได้ และสามารถจัดเก็บไว้ในตัวแปรได้เช่นกัน หากเอาต์พุตของคำสั่งมีขนาดใหญ่พอที่จะไม่พอดีกับหน้าจอ เราจะเหลือเพียงตัวเลือกในการบันทึกเอาต์พุตลงในไฟล์ในตัวแปร ข้อดีอย่างหนึ่งของการบันทึกเอาต์พุตไปยังตัวแปรคือความเร็วในการตรวจสอบที่เร็วขึ้น ตัวแปรจะถูกบันทึกลงในหน่วยความจำและด้วยเหตุนี้จึงมีแนวโน้มที่จะรวดเร็วเมื่อเทียบกับการดึงข้อมูลจากไฟล์
ตัวแปรในภาษาสคริปต์
ตัวแปรเป็นองค์ประกอบสำคัญที่ใช้ในการเขียนสคริปต์เชลล์และประกาศโดยใช้คำสั่ง bash “ประกาศ ” หากต้องการประกาศตัวแปรว่า 'ระดับ' เราจำเป็นต้องดำเนินการคำสั่งด้านล่าง
declare LEVEL
หมายเหตุ: เราจำเป็นต้องใช้ “typecast ” ซึ่งเป็นคำสั่งในตัวสำหรับความเข้ากันได้ของ Korn Shell 'ประกาศ' เป็นคำขั้นสูงกว่าและมีคุณสมบัติทั้งหมด ดังนั้นจึงแนะนำให้ใช้เมื่อใช้ BASH
กฎ
- ชื่อตัวแปรจะต้องจัดชิดขอบ การใช้ตัวแปรในสคริปต์
- แนะนำให้ใช้ชื่อตัวแปรเดียวกันตลอดทั้งโปรแกรม
- ชื่อตัวแปรอาจเป็นตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็กก็ได้ แต่ตามหลักการแล้วคำสั่งเชลล์จะเป็นตัวพิมพ์เล็ก ดังนั้นเราควรใช้ชื่อตัวแปรเป็นตัวพิมพ์ใหญ่ เพื่อขจัดความสับสน เช่น TOTAL_BILLED_AMOUNT, SELL_REPORT, ORDER_RECEIPT เป็นต้น
การนำไปปฏิบัติ
สามารถกำหนดค่าตัวแปรได้โดยใช้เครื่องหมายเท่ากับ (=) ในการกำหนดสตริงว่างให้กับตัวแปร เราต้องไม่ระบุค่าใดๆ หลังเครื่องหมายเท่ากับ
LEVEL =
ตรวจสอบค่าที่เก็บไว้ในตัวแปร 'LEVEL' เช่น
printf "%i" $LEVEL
printf ซึ่งเป็นคำสั่งที่โปรแกรมเมอร์ 'C' ส่วนใหญ่รู้จัก พิมพ์ข้อมูล %i – แสดงถึงจำนวนเต็ม เราสามารถแทนที่ด้วย %c สำหรับ Character หรือ %c สำหรับ string ได้ตามต้องการ
$LEVEL: สังเกต '$' ซึ่งทำหน้าที่เป็นตัวทดแทนค่าสำหรับตัวแปร 'LEVEL'
ผลลัพธ์ตัวอย่าง
printf "%i" $LEVEL
0
กำหนดค่าให้กับตัวแปร
LEVEL=0
ตรวจสอบข้อมูลที่เก็บไว้ในตัวแปร
printf "%i" $LEVEL
0
หมายเหตุ: เป็นเรื่องที่น่าสนใจที่จะทราบว่าในทั้งสองกรณี เมื่อเราไม่ได้กำหนดค่าให้กับตัวแปร และเมื่อเรากำหนดค่า '0<' ไปยังตัวแปร 'LEVEL' เอาต์พุต 0 แม้ว่าผลลัพธ์จะเหมือนกันในทั้งสองกรณี แต่เชลล์สคริปต์จัดการการประกาศตัวแปรทั้งสองต่างกัน
กำหนดค่าใหม่ให้กับตัวแปร
LEVEL=121
ตรวจสอบข้อมูลที่เก็บไว้ในตัวแปร
printf "%i" $LEVEL
121
ยกเลิกการตั้งค่าตัวแปร
ประกาศ เป็นคำสั่ง BASH และสร้างตัวแปรเมื่อดำเนินการเท่านั้น ตัวแปรที่สร้างขึ้นจะยังคงอยู่ในหน่วยความจำจนกว่าสคริปต์จะหยุดหรือตัวแปรถูกทำลาย
unset LEVEL
ตัวแปรที่กำหนดไว้ล่วงหน้าใน BASH
BASH มีตัวแปรมากกว่า 50 ที่กำหนดไว้ล่วงหน้า ตัวแปรเหล่านี้บางตัวมีความหมายพิเศษติดอยู่กับ BASH เช่น ตัวแปร RANDOM จะส่งเอาต์พุตเป็นตัวเลขสุ่ม หากไม่ได้ตั้งค่าแล้วกำหนดอีกครั้ง ค่าตัวแปรดั้งเดิมจะหายไปอย่างถาวร ดังนั้นจึงแนะนำว่าอย่าใช้ตัวแปรที่ระบบกำหนดใดๆ
นี่คือรายการตัวแปร BASH ที่มีประโยชน์บางส่วน
- BASH—ชื่อพาธเต็มของ Bash
- BASH_ENV—ในเชลล์สคริปต์ ชื่อของไฟล์โปรไฟล์ที่ดำเนินการก่อนที่สคริปต์จะเริ่มทำงาน
- BASH_VERSION—เวอร์ชันของ Bash (เช่น 2.04.0(1)-release)
- คอลัมน์—จำนวนอักขระต่อบรรทัดบนจอแสดงผลของคุณ (เช่น 80)
- HOSTNAME—ชื่อของคอมพิวเตอร์ สำหรับ Linux บางเวอร์ชัน อาจเป็นชื่อเครื่องก็ได้ ส่วนโดเมนอื่นๆ อาจเป็นชื่อโดเมนแบบเต็มก็ได้
- HOSTTYPE—ประเภทของคอมพิวเตอร์
- HOME—ชื่อโฮมไดเร็กตอรี่ของคุณ
- OSTYPE—ชื่อของระบบปฏิบัติการ
- PATH—รายการเส้นทางการค้นหาที่คั่นด้วยโคลอนเพื่อค้นหาคำสั่งที่จะดำเนินการ
- PPID—รหัสกระบวนการของกระบวนการหลักของเชลล์
- PROMPT_COMMAND—คำสั่งให้ดำเนินการก่อนการตั้งค่าสตริงพร้อมท์หลักของ PS1
- PWD—ไดเร็กทอรีการทำงานปัจจุบัน (ตามที่กำหนดโดยคำสั่ง cd)
- RANDOM—ส่งคืนตัวเลขสุ่มระหว่าง 0 ถึง 32767 แต่ละครั้งที่มีการอ้างอิง
- SHELL—เชลล์ที่ต้องการใช้ สำหรับโปรแกรมที่เริ่มเชลล์สำหรับคุณ
- TERM—ประเภทการจำลองเทอร์มินัล (เช่น คอนโซล)
กฎการแยกคำ
LEVEL=0
printf "%i" $LEVEL
0
AND
LEVEL=”0”
printf "%i" $LEVEL
0
ในทั้งสองกรณีเอาต์พุตจะยังคงเหมือนเดิม แล้วผลลัพธ์ในขณะที่ใช้ใบเสนอราคาแตกต่างกันอย่างไร?
ให้ตรวจสอบสิ่งเดียวกันกับข้อมูลตัวแปรที่แตกต่างกัน
LEVEL=0 ; 1 ; 2 ; 3 ; 4 ; 5
bash: 1: command not found
bash: 2: command not found
bash: 3: command not found
bash: 4: command not found
bash: 5: command not found
printf "%i" $LEVEL
0
ไม่ต้องพูดถึงผลลัพธ์ที่ไม่ถูกต้อง BASH ใช้ช่องว่างหลัง '0' เป็นจุดสิ้นสุด และด้วยเหตุนี้ค่าของตัวแปรจึงถูกตั้งค่าเป็น '0' ตอนนี้เราลองใช้เครื่องหมายคำพูดสำหรับตัวแปรดังนี้
LEVEL=”0 ; 1 ; 2 ; 3 ; 4 ; 5”
printf "%s" $LEVEL
0;1;2;3;4;5
ผลลัพธ์ก็ยังไม่ถูกต้อง BASH นำค่าตัวแปรและลบช่องว่างทั้งหมดที่อยู่ระหว่างนั้น ดังนั้น printf ไม่ได้ตีความ 0,1,2,3,4,5 ว่าเป็นค่าที่แตกต่างกัน แล้ววิธีแก้ปัญหาคืออะไร?
printf "%s" "$LEVEL"
0 ; 1 ; 2 ; 3 ; 4 ; 5
ใช่! การใส่การทดแทนตัวแปรไว้ใต้เครื่องหมายคำพูดคือวิธีแก้ปัญหา เครื่องหมายคำพูดจัดกลุ่มอักขระในเชลล์และตีความอักขระพิเศษในลักษณะที่มีความหมาย
เครื่องหมายคำพูดสามารถใช้ติดต่อกันได้ และเป็นความคิดที่ดีที่จะรวมการทดแทนตัวแปรด้วยเครื่องหมายคำพูด นอกจากนี้ยังสามารถใช้เพื่อแยกข้อความโดยรวมออกจากเครื่องหมายคำพูดได้ นี่คือตัวอย่าง
LEVEL=5
FLAG_MESSAGE="I HAVE CLEARED LEVEL""$LEVEL"". I Deserve appreciation."
printf “%s” “$FLAG_MESSAGE”
“I HAVE CLEARED LEVEL5. I Deserve appreciation.”
การแยกข้อความที่ยกมาบางส่วนด้วยการเว้นวรรคจะส่งผลให้เกิดปัญหาเดียวกันกับที่กล่าวไว้ข้างต้น ทุบตีจะถือว่าพื้นที่สีขาวเป็นการยุติ การทดแทนตัวแปรอีกวิธีหนึ่งก็คือ
LEVEL=5
FLAG_MESSAGE="I HAVE CLEARED LEVEL ${LEVEL}. I Deserve appreciation."
printf “%s” "$FLAG_MESSAGE"
“I HAVE CLEARED LEVEL 5. I Deserve appreciation.”
เครื่องหมายคำพูดเดี่ยวจำกัด BASH จากการพิมพ์อักขระพิเศษ
printf “%s” '$FLAG_MESSAGE'
“$FLAG_MESSAGE”
แบ็กสแลช (/)
แบ็กสแลชทำงานเหมือนกับเครื่องหมายคำพูดเดี่ยวสำหรับอักขระหนึ่งตัว คุณเคยคิดบ้างไหมว่าคุณจะพิมพ์อย่างไร (“)?
printf "%c" "\""
เมื่อ %q จัดกลุ่มด้วย printf ให้ใส่เครื่องหมายแบ็กสแลชหลังทุกคำเพื่อให้แน่ใจว่ามีการเว้นวรรคระหว่างคำ
LEVEL=5
FLAG_MESSAGE="I HAVE CLEARED LEVEL ${LEVEL}. I Deserve appreciation."
printf “%q” "$FLAG_MESSAGE"
“I\ HAVE\ CLEARED\ LEVEL\ 5.\ I\ Deserve\ appreciation.”
นั่นคือทั้งหมดที่สำหรับตอนนี้. เราพยายามจัดหาบทความที่เป็นประโยชน์สำหรับพวกเขาให้กับผู้อ่านเป็นระยะๆ บทความที่ครอบคลุมข้างต้นมีมากมาย ดังนั้นหัวข้อที่เหลือพร้อมตัวอย่างจะถูกสร้างในบทความถัดไปซึ่งจะรวมถึง 'คุณสมบัติของตัวแปร', 'การส่งออกตัวแปร' เป็นต้น
จนกว่าจะถึงตอนนั้น คอยติดตามและเชื่อมต่อกับ linux-console.net อย่าลืมให้ข้อเสนอแนะอันมีค่าของคุณแก่เราในส่วนความคิดเห็นด้านล่าง