Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม Bash

สคริปต์เชลล์ Linux: การศึกษาลึกเกี่ยวกับตัวแปร – ภาค 9

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

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

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

สคริปต์เชลล์ Linux: การศึกษาลึกเกี่ยวกับตัวแปร – ภาค 9

การบันทึกผลลัพธ์

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

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

ตัวแปรเป็นองค์ประกอบสำคัญที่ใช้ในการเขียนสคริปต์เชลล์ และประกาศโดยใช้คำสั่ง bash "declare" เพื่อประกาศตัวแปร เช่น level เราต้องรันคำสั่งด้านล่างนี้

$ declare LEVEL

หมายเหตุ: เราต้องใช้ "typecast" คำสั่งในตัวสำหรับความเข้ากันได้กับ korn shell คำสั่ง declare ขั้นสูงกว่าและมีฟีเจอร์ครบครัน จึงแนะนำให้ใช้เมื่อทำงานกับ BASH

กฎข้อตกลง

  1. ชื่อตัวแปรต้องสะท้อนถึงวัตถุประสงค์การใช้งานในสคริปต์
  2. แนะนำให้ใช้ชื่อตัวแปรเดียวกันตลอดโปรแกรม
  3. ชื่อตัวแปรสามารถเป็นตัวพิมพ์ใหญ่หรือเล็กได้ แต่โดยข้อตกลงคำสั่งเชลล์จะเป็นตัวพิมพ์เล็ก จึงควรใช้ชื่อตัวแปรเป็นตัวพิมพ์ใหญ่ เพื่อไม่ให้สับสน เช่น TOTAL_BILLED_AMOUNT, SELL_REPORT, ORDER_RECEIPT เป็นต้น

การนำไปใช้

สามารถกำหนดค่าให้ตัวแปรได้โดยใช้เครื่องหมายเท่ากับ (=) หากต้องการกำหนดสตริงว่างให้ตัวแปร ต้องไม่ใส่ค่าหลังเครื่องหมายเท่ากับ

$ LEVEL =

ตรวจสอบค่าที่เก็บในตัวแปร LEVEL ด้วยคำสั่ง

$ printf "%i" $LEVEL

printf เป็นคำสั่งที่โปรแกรมเมอร์ C คุ้นเคย ใช้สำหรับพิมพ์ข้อมูล %i แทนจำนวนเต็ม สามารถเปลี่ยนเป็น %c สำหรับตัวอักษรหรือ %s สำหรับสตริงได้ตามต้องการ

$LEVEL: โปรดสังเกต $ ซึ่งทำหน้าที่แทนค่าของตัวแปร LEVEL

ตัวอย่างผลลัพธ์

$ printf "%i" $LEVEL
0

กำหนดค่าให้ตัวแปร

$ LEVEL=0

ตรวจสอบข้อมูลที่เก็บในตัวแปร

$ printf "%i" $LEVEL
0

หมายเหตุ: สนใจที่จะเห็นว่าในทั้งสองกรณี ไม่ว่าจะไม่ได้กำหนดค่าให้ตัวแปร หรือกำหนดค่า 0 ให้ตัวแปร LEVEL ผลลัพธ์ก็คือ 0 แม้ผลลัพธ์จะเหมือนกัน แต่เชลล์สคริปต์จัดการการประกาศตัวแปรทั้งสองแบบอย่างแตกต่างกัน

กำหนดค่าใหม่ให้ตัวแปร

$ LEVEL=121

ตรวจสอบข้อมูลที่เก็บในตัวแปร

$ printf "%i" $LEVEL
121

การยกเลิกตัวแปร

Declare เป็นคำสั่ง 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. COLUMNS — จำนวนตัวอักษรต่อบรรทัดบนหน้าจอ (เช่น 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 — ประเภทการจำลองเทอร์มินัล (เช่น console)

กฎการแยกคำ (Word Splitting)

$ 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."

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

$ 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"

เครื่องหมายทับกลับ (Backslash)

Backslash ทำงานเหมือนเครื่องหมายคำพูดเดี่ยวแต่สำหรับตัวอักษรเพียงตัวเดียว คุณเคยคิดไหมว่าจะพิมพ์ " ยังไง?

$ printf "%c" "\""

เมื่อ %q ร่วมกับ printf จะใส่ backslash หลังทุกคำเพื่อให้ช่องว่างระหว่างคำคงอยู่

$ LEVEL=5
$ FLAG_MESSAGE="I HAVE CLEARED LEVEL ${LEVEL}. I Deserve appreciation."
$ printf "%q" "$FLAG_MESSAGE"
"I\ HAVE\ CLEARED\ LEVEL\ 5.\ I\ Deserve\ appreciation."

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

จนกว่าจะพบกันใหม่ ขอให้อยู่ติดต่อกับ Tecmint.com อย่าลืมให้ความคิดเห็นที่มีค่าในส่วนความคิดเห็นด้านล่างครับ