เชลล์สคริปต์เบื้องต้น ตอนที่ 8 - วงวน while, ฟังก์ชัน
www.tanabutr.co.th/photobook
ตอนนี้จะแนะวงวน while ซึ่งเป็นวงวนที่มีใช้ในภาษาคอมพิวเตอร์ทั่วไปมีรูปแบบการใช้งานดังนี้.
whilecommand docommand ... done
หรือจะเขียนเป็นบรรทัดเดียวก็ได้
whilecommand ; docommand ; ...; done
คำสั่งที่อยู่หลัง while มักจะเป็นคำสั่ง test (อย่าลืมว่า [ ก็คือคำสั่ง test) หรือจะเป็นคำสั่งอะไรก็ได้. เราลองมาดูตัวอย่างการคำนวณผลบวกของอนุกรม 1, 2, 3, ..., n สามารถเขียนในบรรทัดคำสั่งได้ดังนี้.
$ sum=0; n=10; i=1 $ while [ $i -le $n ] > do > sum=$(($sum+$i)) > ((i++)) > done $ echo $sum 55
ตัวอย่างเป็นการหาผลบวกของ 1 ถึง 10. ตอนแรกสร้างตัวแปร sum, n และ i ให้มีค่าเป็น 0, 10 และ 1. ต่อจากนั้นก็เข้าวงวน while โดยมีเงื่อนไขว่า $i น้อยกว่าหรือเท่ากับ $n. -le เป็นตัวเลือกของคำสั่ง test หมายถึง less or equal than.
เนื้อหาของวงวนเป็นการบวกค่า sum ไปเรื่อยๆและเพิ่มค่า i ก่อนออกจากวงวนแต่ละรอบ. เมื่อคำนวณเสร็จแล้วก็จะได้ผลลัพธ์เก็บไว้ในตัวแปร sum.
ทำนองเดียวกันถ้าจะใช้วงวน for เขียนแทนก็สามารถเขียนได้แบบนี้ (หนึ่งในหลายแบบ)
$ sum=0; for i in `seq 1 10`; do sum=$(($sum+$i)); done $ echo $sum 55
ในกรณีนี้จะใช้ผลลัพธ์ของคำสั่ง seq ซึ่งจะแสดงค่าตั้งแต่ 1 ถึง 10.
$ seq 1 10 1 2 3 4 5 6 7 8 9 10
ฟังก์ชัน
เราสามารถสร้างฟังก์ชันในเชลล์ด้วยคำสั่ง function มีรูปแบบดังนี้.
functionname {command ... }
คำที่อยู่หลัง function เป็นชื่อของฟังก์ชันที่ตั้งเองได้. ฟังก์ชันสามารถรับอาร์กิวเมนต์ได้โดยอ้างอิงตัวแปรตำแหน่ง $1, $2, $3 ... หมายถึงอาร์กิวเมนต์ตัวที่ 1, 2, 3 ฯลฯ.
ตัวอย่างต่อไปนี้เป็นการสร้างฟังก์ชันหาผลลัพธ์ของผลบวกตั้งแต่ 1 ถึงจำนวนเต็มที่ต้องการโดยให้จำนวนเต็มที่ต้องการเป็นอาร์กิวเมนต์ของฟังก์ชัน.
#!/bin/sh
function sum {
s=0
for i in `seq 1 $1`
do
s=$(($s+$i))
done
echo $s
}
sum 100
หลังจากที่นิยามฟังก์ชันแล้วก็สามารถใช้ชื่อฟังก์ชันนั้นเป็นคำสั่งเหมือนคำสั่งอื่นๆ. ในความเป็นจริงแล้วเราสามารถละเว้นคำว่า function จะไม่เขียนก็ได้.
สมมติว่าไฟล์นี้ชื่อ sum.sh, เมื่อรันแล้วจะได้ผลลัพธ์เป็น 5050.
$ ./sum.sh 5050
การกำหนดฟังก์ชันมีประโยชน์สามารถนิยามการกระทำต่างๆไว้ได้ในไฟล์ ~/.bashrc หรือ ~/.bash_profile. เมื่อล็อกอินหรือใช้เชลล์จากเทอร์มินอล, ไฟล์เหล่านี้จะถูกอ่านเข้าไปในเชลล์, ซึ่งจะเป็นการนิยามฟังก์ชันที่เตรียมไว้. หลังจากนั้นจะเรียกใช้เมื่อไหร่ก็ได้.