เชลล์สคริปต์เบื้องต้น ตอนที่ 8 - วงวน while, ฟังก์ชัน

อัดรูปดิจิตอล ทำสมุดภาพของคุณเอง
รอรับได้. ท่องเที่ยว แต่งงาน ฯลฯ

www.tanabutr.co.th/photobook


ตอนนี้จะแนะวงวน while ซึ่งเป็นวงวนที่มีใช้ในภาษาคอมพิวเตอร์ทั่วไปมีรูปแบบการใช้งานดังนี้.

while command
do
    command
    ...
done

หรือจะเขียนเป็นบรรทัดเดียวก็ได้

while command; do command; ...; 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 มีรูปแบบดังนี้.

function name {
   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. เมื่อล็อกอินหรือใช้เชลล์จากเทอร์มินอล, ไฟล์เหล่านี้จะถูกอ่านเข้าไปในเชลล์, ซึ่งจะเป็นการนิยามฟังก์ชันที่เตรียมไว้. หลังจากนั้นจะเรียกใช้เมื่อไหร่ก็ได้.