ค้นหาเว็บไซต์

ข้อมูลเชิงลึกของ Linux "ตัวแปร" ในภาษาเชลล์สคริปต์ - ตอนที่ 9


เราได้เขียนบทความหลายชุดเกี่ยวกับ Linux Shell Scripting ซึ่งได้รับการตอบรับอย่างอบอุ่นในครั้งนั้น และตอนนี้ก็มีความเกี่ยวข้องมากด้วย นี่คือลิงค์ไปยังชุดบทความเกี่ยวกับเชลล์สคริปต์

  1. เรียนรู้การเขียนสคริปต์เชลล์ Linux

ในบทความนี้ เราจะเห็น ตัวแปร การดำเนินการ และการนำไปใช้งานในเชลล์สคริปต์

การบันทึกเอาท์พุต

เอาต์พุตของคำสั่งสามารถเปลี่ยนเส้นทางไปยังเอาต์พุตมาตรฐานหรือไฟล์ได้ และสามารถจัดเก็บไว้ในตัวแปรได้เช่นกัน หากเอาต์พุตของคำสั่งมีขนาดใหญ่พอที่จะไม่พอดีกับหน้าจอ เราจะเหลือเพียงตัวเลือกในการบันทึกเอาต์พุตลงในไฟล์ในตัวแปร ข้อดีอย่างหนึ่งของการบันทึกเอาต์พุตไปยังตัวแปรคือความเร็วในการตรวจสอบที่เร็วขึ้น ตัวแปรจะถูกบันทึกลงในหน่วยความจำและด้วยเหตุนี้จึงมีแนวโน้มที่จะรวดเร็วเมื่อเทียบกับการดึงข้อมูลจากไฟล์

ตัวแปรในภาษาสคริปต์

ตัวแปรเป็นองค์ประกอบสำคัญที่ใช้ในการเขียนสคริปต์เชลล์และประกาศโดยใช้คำสั่ง bash “ประกาศ ” หากต้องการประกาศตัวแปรว่า 'ระดับ' เราจำเป็นต้องดำเนินการคำสั่งด้านล่าง

declare LEVEL

หมายเหตุ: เราจำเป็นต้องใช้ “typecast ” ซึ่งเป็นคำสั่งในตัวสำหรับความเข้ากันได้ของ Korn Shell 'ประกาศ' เป็นคำขั้นสูงกว่าและมีคุณสมบัติทั้งหมด ดังนั้นจึงแนะนำให้ใช้เมื่อใช้ BASH

กฎ
  1. ชื่อตัวแปรจะต้องจัดชิดขอบ การใช้ตัวแปรในสคริปต์
  2. แนะนำให้ใช้ชื่อตัวแปรเดียวกันตลอดทั้งโปรแกรม
  3. ชื่อตัวแปรอาจเป็นตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็กก็ได้ แต่ตามหลักการแล้วคำสั่งเชลล์จะเป็นตัวพิมพ์เล็ก ดังนั้นเราควรใช้ชื่อตัวแปรเป็นตัวพิมพ์ใหญ่ เพื่อขจัดความสับสน เช่น 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 ที่มีประโยชน์บางส่วน

  1. BASH—ชื่อพาธเต็มของ Bash
  2. BASH_ENV—ในเชลล์สคริปต์ ชื่อของไฟล์โปรไฟล์ที่ดำเนินการก่อนที่สคริปต์จะเริ่มทำงาน
  3. BASH_VERSION—เวอร์ชันของ Bash (เช่น 2.04.0(1)-release)
  4. คอลัมน์—จำนวนอักขระต่อบรรทัดบนจอแสดงผลของคุณ (เช่น 80)
  5. HOSTNAME—ชื่อของคอมพิวเตอร์ สำหรับ Linux บางเวอร์ชัน อาจเป็นชื่อเครื่องก็ได้ ส่วนโดเมนอื่นๆ อาจเป็นชื่อโดเมนแบบเต็มก็ได้
  6. HOSTTYPE—ประเภทของคอมพิวเตอร์
  7. HOME—ชื่อโฮมไดเร็กตอรี่ของคุณ
  8. OSTYPE—ชื่อของระบบปฏิบัติการ
  9. PATH—รายการเส้นทางการค้นหาที่คั่นด้วยโคลอนเพื่อค้นหาคำสั่งที่จะดำเนินการ
  10. PPID—รหัสกระบวนการของกระบวนการหลักของเชลล์
  11. PROMPT_COMMAND—คำสั่งให้ดำเนินการก่อนการตั้งค่าสตริงพร้อมท์หลักของ PS1
  12. PWD—ไดเร็กทอรีการทำงานปัจจุบัน (ตามที่กำหนดโดยคำสั่ง cd)
  13. RANDOM—ส่งคืนตัวเลขสุ่มระหว่าง 0 ถึง 32767 แต่ละครั้งที่มีการอ้างอิง
  14. SHELL—เชลล์ที่ต้องการใช้ สำหรับโปรแกรมที่เริ่มเชลล์สำหรับคุณ
  15. 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 อย่าลืมให้ข้อเสนอแนะอันมีค่าของคุณแก่เราในส่วนความคิดเห็นด้านล่าง