เราได้เขียนชุดบทความเกี่ยวกับ การเขียนสคริปต์เชลล์ Linux ซึ่งได้รับความนิยมสูงและยังคงเกี่ยวข้องมากจนถึงปัจจุบัน นี่คือลิงก์ไปยังคอลเลกชันบทความเกี่ยวกับการเขียนสคริปต์เชลล์
- เรียนรู้การเขียนสคริปต์เชลล์ Linux
ในบทความนี้เราจะมาดูเกี่ยวกับ ตัวแปร การทำงานและการนำไปใช้ในสคริปต์เชลล์
การบันทึกผลลัพธ์
ผลลัพธ์ของคำสั่งสามารถเปลี่ยนเส้นทางไปยังเอาต์พุตมาตรฐานหรือไฟล์ และยังสามารถเก็บไว้ในตัวแปรได้เช่นกัน หากผลลัพธ์ของคำสั่งมีขนาดใหญ่จนไม่สามารถแสดงบนหน้าจอได้ เราจะเหลือเพียงทางเลือกเดียวคือการบันทึกผลลัพธ์ลงไฟล์หรือตัวแปร ข้อดีหนึ่งของการบันทึกผลลัพธ์ในตัวแปรคือความเร็วในการตรวจสอบที่สูงกว่า ตัวแปรถูกเก็บไว้ในหน่วยความจำ จึงทำให้เร็วกว่าการดึงข้อมูลจากไฟล์
ตัวแปรในภาษาสคริปต์
ตัวแปรเป็นองค์ประกอบสำคัญที่ใช้ในการเขียนสคริปต์เชลล์ และประกาศโดยใช้คำสั่ง bash "declare" เพื่อประกาศตัวแปร เช่น level เราต้องรันคำสั่งด้านล่างนี้
$ declare LEVEL
หมายเหตุ: เราต้องใช้ "typecast" คำสั่งในตัวสำหรับความเข้ากันได้กับ korn shell คำสั่ง declare ขั้นสูงกว่าและมีฟีเจอร์ครบครัน จึงแนะนำให้ใช้เมื่อทำงานกับ BASH
กฎข้อตกลง
- ชื่อตัวแปรต้องสะท้อนถึงวัตถุประสงค์การใช้งานในสคริปต์
- แนะนำให้ใช้ชื่อตัวแปรเดียวกันตลอดโปรแกรม
- ชื่อตัวแปรสามารถเป็นตัวพิมพ์ใหญ่หรือเล็กได้ แต่โดยข้อตกลงคำสั่งเชลล์จะเป็นตัวพิมพ์เล็ก จึงควรใช้ชื่อตัวแปรเป็นตัวพิมพ์ใหญ่ เพื่อไม่ให้สับสน เช่น 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 ที่มีประโยชน์บางส่วน
- BASH — พาธเต็มของ Bash
- BASH_ENV — ในสคริปต์เชลล์ ชื่อไฟล์โปรไฟล์ที่ถูกเรียกใช้ก่อนเริ่มสคริปต์
- BASH_VERSION — รุ่นของ Bash (เช่น 2.04.0(1)-release)
- COLUMNS — จำนวนตัวอักษรต่อบรรทัดบนหน้าจอ (เช่น 80)
- HOSTNAME — ชื่อคอมพิวเตอร์ ในบางรุ่น Linux อาจเป็นชื่อเครื่องหรือโดเมนเต็มรูปแบบ
- HOSTTYPE — ประเภทของคอมพิวเตอร์
- HOME — ชื่อไดเรกทอรีบ้านของคุณ
- OSTYPE — ชื่อระบบปฏิบัติการ
- PATH — รายการพาธค้นหาแยกด้วยโคลอน เพื่อหาคำสั่งที่จะรัน
- PPID — รหัสกระบวนการของกระบวนการแม่ของเชลล์
- PROMPT_COMMAND — คำสั่งที่รันก่อนตั้งค่า PS1 พรอมป์ต์หลัก
- PWD — ไดเรกทอรีทำงานปัจจุบัน (ตามที่คำสั่ง cd ตั้งค่า)
- RANDOM — ส่งคืนตัวเลขสุ่มระหว่าง 0 ถึง 32767 ทุกครั้งที่อ้างอิง
- SHELL — เชลล์ที่ต้องการใช้ สำหรับโปรแกรมที่เริ่มเชลล์ให้คุณ
- 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 อย่าลืมให้ความคิดเห็นที่มีค่าในส่วนความคิดเห็นด้านล่างครับ