เชลล์สคริปต์เบื้องต้น ตอนที่ 9 - ตอนจบ
www.tanabutr.co.th/photobook
ครั้งก่อนได้แนะนำการสร้างฟังก์ชันและวงวน while ไปเรียบร้อยแล้ว. ครั้งนี้เขียนเกี่ยวกับเชลล์สคริปต์เป็นครั้งสุดท้าย. เชลล์สคริปต์ที่เป็นตัวอย่างในวันนี้เป็นเชลล์จะใช้ฟังก์ชันที่สร้างไว้ในครั้งก่อนได้แก่ฟังก์ชันหาผลรวมของลำดับตั้งแต่ 1 ถึง N. เชลล์สคริปต์จะแสดงข้อความให้ผู้ใช้เติมตัวเลข, ตรวจสอบว่าสิ่งที่ผู้ใช้พิมพ์เข้ามาเป็นตัวเลขหรือไม่. ถ้าไม่ใช่ตัวเลขจำนวนเต็มก็จะให้ป้อนข้อมูลใหม่. หลังจากที่ได้ตัวเลขแล้วก็จะหาผลรวมตั้งแต่ 1 ถึงตัวเลขนั้น.

1 #!/bin/sh
2 function sum {
3 s=0
4 for i in `seq 1 $1`
5 do
6 s=$(($s+$i))
7 done
8 echo $s
9 }
10 while true
11 do
12 echo -n "ใส่ข้อมูลจำนวนเต็ม: "
13 read input
14 if egrep '^[[:digit:]]+$' > /dev/null <<<$input && [ $input -ne 0 ]
15 then
16 break
17 fi
18 echo -e "\033[31mต้องการจำนวนเต็มบวกที่มากกว่า 0 เท่านั้น.\033[0m"
19 done
20
21 echo "1 + 2 + 3 + ... + $input = `sum $input`"
บรรทัดที่ 1 - 9 เป็นการนิยามฟังก์ชันชื่อ sum หาผลบวกของลำดับ 1 ถึงจำนวนเต็มบวกที่ต้องการ. รายละเอียดของฟังก์ชันนี้อธิบายไปในตอนที่แล้ว.
บรรทัดที่ 10 เป็นการเริ่มต้นวงวน while สำหรับรับข้อมูลนำเข้าจากคีย์บอร์ด. true (คำสั่งที่ตรงข้ามกับ true คือ false) เป็นคำสั่งที่ไม่ทำอะไร, ให้ค่าสถานะจบการทำงานเป็น 0. ในที่นี้ใช้ while true เพื่อให้สร้างวงวนไม่รู้จบ. ถ้าข้อมูลที่ผู้ใช้ใส่ให้สคริปต์เป็นเลขจำนวนเต็มมากกว่า 0 ก็จะออกจากวงวนโดยใช้คำสั่ง break, ถ้าไม่ใช่จำนวนเต็มก็จะถามวนไปเรื่อยๆจนกว่าจะป้อนข้อมูลที่ถูกต้อง.
บรรทัดที่ 12 เป็นการใช้คำสั่ง echo กับตัวเลือก -n ให้ไม่ต้องขึ้นบรรทัดใหม่. หลังจาก echo แล้วก็ใช้คำสั่ง read อ่านข้อมูลจากคีย์บอร์ดเก็บเข้าตัวแปรชื่อ input ในบรรทัดที่ 13.
ตรวจสอบข้อมูลด้วย egrep และ test
บรรทัดที่ 14 อาจจะเรียกได้ว่าเป็นบรรทัดที่ซับซ้อนที่สุดในสคริปต์. แต่ดูให้ดีแล้วจะรู้ว่าไม่ยากเลย. มีเงื่อนไข 2 อย่างเชื่อมด้วย && (and) ในคำสั่ง if ได้แก่
egrep '^[[:digit:]]+$' > /dev/null <<<$input
เราใช้่คำสั่ง egrep เพื่อเช็คว่าข้อมูลที่อยู่ในตัวแปร input เป็นเลขจำนวนเต็มหรือไม่. คำสั่ง egrep เป็นคำสั่งตระกูลเดียวกับ grep, "e" หมายถึง extension สามารถใช้ regular expression เช่น "[", "]" ได้ซึ่งคำสั่ง grep ธรรมดาจะถือว่าอักษร "[", "]" เป็นอักษรธรรมดา. "^" หมายถึงต้นบรรทัด, "[[:digit:]]" หมายถึงตัวเลขใดๆตั้งแต่ 0 - 9. "+" หมายถึงมีตัวเลขอย่างน้อยหนึ่งตัวเรียงต่อกันไป. และ "$" หมายถึงจบบรรทัด.
regular expression ที่คล้ายกับ "[[:digit:]]" ยังมี
| [[:alnum:]] | ตัวเลขและตัวอักษร |
| [[:alpha:]] | ตัวอักษรภาษาอังกฤษ |
| [[:blank:]] | ช่องว่าง |
| [[:lower:]] | ตัวอักษรภาษาอังกฤษตัวเล็ก |
| [[:upper:]] | ตัวอักษรภาษาอังกฤษตัวใหญ่ |
| [[:punct:]] | เครื่องหมายต่างๆ |
คำสั่ง egrep โดยปรกติจำใช้หาคำที่อยู่ในไฟล์โดยให้ชื่อไฟล์เป็นอาร์กิวเมนต์. แต่ในตัวอย่างจะหาคำ (เช็คคำ) ที่อยู่ในตัวแปร input โดยใช้วิธี redirection. เครื่องหมาย "<<<" เป็นการนำตัวแปรเข้าไปใน standard input เพื่อส่งต่อให้คำสั่ง egrep. มีผลเหมือนกับ egrep อ่านข้อมูลจากไฟล์.
คำสั่ง egrep จะแสดงผลสิ่งที่ค้นหาได้ทางหน้าจอ. เพื่อที่จะไม่แสดงผลดังกล่างจึง redirect ผลลัพธ์ของ egrep โดยใช้เครื่องหมาย ">" ไปที่ /dev/null. คือไม่ให้แสดงผลทางหน้าจอ.
เงื่อนไขที่สองต้องตรวจสอบดูว่าข้อมูลที่อยู่ในตัวแปร input มีค่ามากกว่า 0 หรือไม่. กรณีนี้ตรวจสอบว่าค่าของตัวแปรไม่เท่ากับ 0 ก็เพียงพอแล้ว.
[ $input -ne 0 ]
ตัวเลือก -ne หมายถึง not equal, เทียบค่าตัวแปร $input กับ 0. ถ้าเงื่อนไขทั้งสองเป็นจริงก็จะสั่งคำสั่ง break ในบรรทัดที่ 16 เพื่อออกจากวงวน while.
สีในเทอร์มินอล
บรรทัดที่ 18 จะใช้ echo แสดงข้อความให้ผู้ใช้ป้อนข้อมูลใหม่โดยแสดงข้อความเป็นสีแดง. การแสดงข้อความเป็นสีเป็นความสามารถของเทอร์มินอล. คำสั่ง echo จะใช้ตัวเลือก -e ให้สามารถใช้เครื่องหมาย "\" แทนอักขระต่างๆได้. เช่น "\0101" แสดงตัวอักษร "A". "\033" หมายถึงอักขระ ESCAPE ในชุดอักขระ ASCII. ใช้สำหรับควบคุมเทอร์มินอล.
"[31m" เป็นการเซ็ตสีของตัวอักษรให้เป็นสีแดง. ส่วน "[0m" เป็นการเซ็ตตัวอักษรให้กลับเป็นปรกติ. สีที่ใช้ได้ในเทอร์มินอลจะใช้รหัสที่เรียกว่าเรียกว่า ANSI color code.
| รหัส | ความหมาย |
|---|---|
| [0m | เซ็ตกลับให้เป็นปรกติ |
| [1m | ตัวหนา |
| [3m | ตัวเอียง |
| [4m | ขีดเส้นใต้ |
| [7m | กลับสีของฉากหลังและตัวอักษร |
| [30m | เซ็ตสีตัวอักษรให้เป็นสีดำ |
| [31m | เซ็ตสีตัวอักษรให้เป็นสีแดง |
| [32m | เซ็ตสีตัวอักษรให้เป็นสีเขียว |
| [33m | เซ็ตสีตัวอักษรให้เป็นสีเหลือง |
| [34m | เซ็ตสีตัวอักษรให้เป็นสีฟ้า |
| [35m | เซ็ตสีตัวอักษรให้เป็นสีม่วงแดง (magenta) |
| [36m | เซ็ตสีตัวอักษรให้เป็นสีฟ้าอมเขียว (cyan) |
| [37m | เซ็ตสีตัวอักษรให้เป็นสีขาว |
| [39m | เซ็ตสีของฉากหลังให้เป็นสีปริยาย (สีขาว) |
| [40m | เซ็ตสีของฉากหลังให้เป็นสีดำ |
| [41m | เซ็ตสีของฉากหลังให้เป็นสีแดง |
| [42m | เซ็ตสีของฉากหลังให้เป็นสีเขียว |
| [43m | เซ็ตสีของฉากหลังให้เป็นสีเหลือง |
| [44m | เซ็ตสีของฉากหลังให้เป็นสีน้ำเงิน |
| [45m | เซ็ตสีของฉากหลังให้เป็นสีม่วงแดง |
| [46m | เซ็ตสีของฉากหลังให้เป็นสีฟ้าแกมเขียว |

บรรทัดที่ 21 เป็นการแสดงผลลัพธ์และเรียกใช้ฟังก์ชัน sum.
ต่อจากนี้
เว็บล็อกนี้เป็นบันทึกสุดท้ายที่เกี่ยวกับเชลล์สคริปต์เบื้องต้น. สำหรับผู้ที่สนใจเรียนรู้เชลล์สคริปต์อย่างจริงๆสามารถอ่านเพิ่มเติมได้จาก.
- อ่าน man bash หรือเอกสารกำกับโปรแกรม.
- อ่าน Bash Guide for Beginners, Advanced Bash-Scripting Guide
และก็ใช้บรรทัดคำสั่งให้มากจะได้รู้จักคำสั่ง, โปรแกรมคำสั่งต่างๆมากขึ้นครับ.