ฟังก์ชันมีบทบาทสำคัญในภาษาการเขียนโปรแกรมใดๆ เช่นเดียวกับภาษาโปรแกรมจริงหลายๆ ภาษา bash มีฟังก์ชันที่ใช้กับการใช้งานที่จำกัด
หน้าที่คืออะไร
ในการเขียนโปรแกรม ฟังก์ชันจะตั้งชื่อว่าส่วนต่างๆ ของโปรแกรมที่ทำงานเฉพาะ ในแง่นี้ ฟังก์ชันคือประเภทของขั้นตอนหรือกิจวัตร เมื่อเรียกใช้ฟังก์ชัน โปรแกรมจะออกจากส่วนปัจจุบันของโค้ดและเริ่มดำเนินการบรรทัดแรกภายในฟังก์ชัน เมื่อใดก็ตามที่มีโค้ดซ้ำๆ หรือเมื่องานเกิดซ้ำ ให้พิจารณาใช้ฟังก์ชันแทน
ตัวอย่างเช่น พิจารณากรณีที่เราต้องค้นหาแฟกทอเรียลของตัวเลขในหลายขั้นตอนของโปรแกรมหนึ่งๆ แทนที่จะเขียนโค้ดทั้งหมด (สำหรับคำนวณแฟคทอเรียล) ทุกครั้ง เราสามารถเขียนโค้ดส่วนนั้นซึ่งคำนวณแฟคทอเรียลครั้งเดียวภายในบล็อกและนำกลับมาใช้ซ้ำได้หลายครั้ง
ทำไมเราถึงเขียนฟังก์ชัน
- ช่วยให้เราใช้รหัสซ้ำได้
- ปรับปรุงความสามารถในการอ่านของโปรแกรม
- การใช้ตัวแปรภายในโปรแกรมอย่างมีประสิทธิภาพ
- อนุญาตให้เราทดสอบโปรแกรมทีละส่วน
- แสดงโปรแกรมเป็นกลุ่มของขั้นตอนย่อย
ฟังก์ชันในเชลล์สคริปต์
ไวยากรณ์ทั่วไปสำหรับการเขียนฟังก์ชันในเชลล์สคริปต์มีวิธีการดังต่อไปนี้
function func_name {
. . .
commands
. . .
}
or
func_name ( ) {
. . .
commands
. . .
}
Opening curly braces can also be used in the second line as well.
func_name ( )
{
. . .
commands
. . .
} คุณมีอิสระในการเขียนคำสั่งที่ถูกต้องภายในบล็อคฟังก์ชันเหล่านี้ เช่นเดียวกับที่เราทำตามปกติในเชลล์สคริปต์ ตอนนี้เรามาลองเขียนสคริปต์ง่ายๆ หนึ่งสคริปต์ที่มีฟังก์ชันเล็กๆ อยู่ข้างในกัน
#!/bin/bash
call_echo ( ) {
echo ‘This is inside function’
}
op=$1
if [ $# -ne 1 ]; then
echo "Usage: $0 <1/0>"
else
if [ $1 = 0 ] ; then
echo ‘This is outside function’
elif [ $1 = 1 ] ; then
call_echo
else
echo ‘Invalid argument’
fi
fi
exit 0 นิยามฟังก์ชันต้องมาก่อนการเรียกครั้งแรก ไม่มีอะไรที่เหมือนกับ 'การประกาศฟังก์ชัน' ก่อนเรียกใช้ และเราสามารถซ้อนฟังก์ชันภายในฟังก์ชันได้เสมอ
หมายเหตุ :- การเขียนฟังก์ชันว่างจะส่งผลให้เกิดข้อผิดพลาดทางไวยากรณ์เสมอ
เมื่อมีการกำหนดฟังก์ชันเดียวกันหลายครั้ง เวอร์ชันสุดท้ายคือสิ่งที่เรียกใช้ มาดูตัวอย่างกัน
#!/bin/bash
func_same ( ) {
echo ‘First definition’
}
func_same ( ) {
echo ‘Second definition’
}
func_same
exit 0 ฟังก์ชันรับพารามิเตอร์และส่งกลับค่า
มาดูรายละเอียดกันโดยพิจารณาถึงฟังก์ชันที่ใช้พารามิเตอร์และส่งกลับค่า ในการคืนค่าจากฟังก์ชัน เราใช้เชลล์ 'return' ในตัว ไวยากรณ์มีดังนี้
func_name ( ) {
. . .
commands
. . .
return $ret_val
} ในทำนองเดียวกัน เราสามารถส่งต่ออาร์กิวเมนต์ไปยังฟังก์ชันที่คั่นด้วยการเว้นวรรคตามที่ระบุด้านล่าง
func_name $arg_1 $arg_2 $arg_3
ภายในฟังก์ชัน เราสามารถเข้าถึงอาร์กิวเมนต์ตามลำดับเป็น $1, $2, $3 และอื่นๆ ดูตัวอย่างสคริปต์ต่อไปนี้เพื่อค้นหาจำนวนเต็มสูงสุดสองจำนวนโดยใช้ฟังก์ชันเพื่อเพิ่มความชัดเจน
#!/bin/bash
USG_ERR=7
max_two ( ) {
if [ "$1" -eq "$2" ] ; then
echo 'Equal'
exit 0
elif [ "$1" -gt "$2" ] ; then
echo $1
else
echo $2
fi
}
err_str ( ) {
echo "Usage: $0 <number1> <number2>"
exit $USG_ERR
}
NUM_1=$1
NUM_2=$2
x
if [ $# -ne 2 ] ; then
err_str
elif [ `expr $NUM_1 : '[0-9]*'` -eq ${#NUM_1} ] ; then
if [ `expr $NUM_2 : '[0-9]*'` -eq ${#NUM_2} ] ; then
max_two $NUM_1 $NUM_2
else
err_str
fi
else
err_str
fi
exit 0 ด้านบนดูเหมือนซับซ้อนเล็กน้อย แต่ง่ายถ้าเราอ่านผ่านบรรทัด ก่อนอื่นให้ซ้อน if-else ถ้าบรรทัดสำหรับการตรวจสอบความถูกต้อง เช่น เพื่อตรวจสอบจำนวนและประเภทของอาร์กิวเมนต์ด้วยความช่วยเหลือของนิพจน์ทั่วไป หลังจากนั้นเราเรียกใช้ฟังก์ชันด้วยอาร์กิวเมนต์บรรทัดคำสั่งสองอาร์กิวเมนต์และแสดงผลที่นั่น เนื่องจากเราไม่สามารถคืนค่าจำนวนเต็มขนาดใหญ่จากฟังก์ชันได้ อีกวิธีในการแก้ไขปัญหานี้คือการใช้ตัวแปรส่วนกลางเพื่อเก็บผลลัพธ์ไว้ในฟังก์ชัน สคริปต์ด้านล่างอธิบายวิธีการนี้
#!/bin/bash
USG_ERR=7
ret_val=
max_two ( ) {
if [ "$1" -eq "$2" ] ; then
echo 'Equal'
exit 0
elif [ "$1" -gt "$2" ] ; then
ret_val=$1
else
ret_val=$2
fi
}
err_str ( ) {
echo "Usage: $0 <number1> <number2>"
exit $USG_ERR
}
NUM_1=$1
NUM_2=$2
if [ $# -ne 2 ] ; then
err_str
elif [ `expr $NUM_1 : '[0-9]*'` -eq ${#NUM_1} ] ; then
if [ `expr $NUM_2 : '[0-9]*'` -eq ${#NUM_2} ] ; then
max_two $NUM_1 $NUM_2
echo $ret_val
else
err_str
fi
else
err_str
fi
exit 0 ตอนนี้ ลองใช้ปัญหาที่น่าตื่นเต้นที่ได้อธิบายไว้ในชุดเชลล์สคริปต์ก่อนหน้าโดยใช้ฟังก์ชันดังต่อไปนี้
- ทำความเข้าใจเคล็ดลับภาษาสคริปต์ Linux Shell ขั้นพื้นฐาน – ตอนที่ 1
- 5 เชลล์สคริปต์สำหรับมือใหม่ Linux เพื่อเรียนรู้การเขียนโปรแกรมเชลล์ – ตอนที่ II
- ท่องโลกของ Linux BASH Scripting – ตอนที่ III
- แง่มุมทางคณิตศาสตร์ของการเขียนโปรแกรม Linux Shell – ส่วนที่ IV
- การคำนวณนิพจน์ทางคณิตศาสตร์ในภาษาสคริปต์ของเชลล์ – ตอนที่ V
ฉันจะกลับมาพร้อมข้อมูลเชิงลึกเพิ่มเติมเกี่ยวกับคุณสมบัติการทำงาน เช่น การใช้ตัวแปรในเครื่อง การเรียกซ้ำ ฯลฯ ในส่วนถัดไป ปรับปรุงอยู่กับความคิดเห็น