Unix / Linux - ฟังก์ชันเชลล์
ในบทนี้เราจะพูดถึงรายละเอียดเกี่ยวกับฟังก์ชันเชลล์ ฟังก์ชันช่วยให้คุณสามารถแบ่งฟังก์ชันการทำงานโดยรวมของสคริปต์ออกเป็นส่วนย่อยทางตรรกะที่เล็กลงซึ่งสามารถเรียกให้ทำงานแต่ละอย่างได้เมื่อจำเป็น
การใช้ฟังก์ชันเพื่อทำงานซ้ำ ๆ เป็นวิธีที่ยอดเยี่ยมในการสร้าง code reuse. นี่เป็นส่วนสำคัญของหลักการเขียนโปรแกรมเชิงวัตถุสมัยใหม่
ฟังก์ชันเชลล์คล้ายกับรูทีนย่อยโพรซีเดอร์และฟังก์ชันในภาษาโปรแกรมอื่น ๆ
การสร้างฟังก์ชัน
ในการประกาศฟังก์ชันเพียงใช้ไวยากรณ์ต่อไปนี้ -
function_name () {
list of commands
}
ชื่อฟังก์ชันของคุณคือ function_nameและนั่นคือสิ่งที่คุณจะใช้เรียกมันจากที่อื่นในสคริปต์ของคุณ ชื่อฟังก์ชันต้องตามด้วยวงเล็บตามด้วยรายการคำสั่งที่อยู่ภายในวงเล็บปีกกา
ตัวอย่าง
ตัวอย่างต่อไปนี้แสดงการใช้ฟังก์ชัน -
#!/bin/sh
# Define your function here
Hello () {
echo "Hello World"
}
# Invoke your function
Hello
เมื่อดำเนินการคุณจะได้รับผลลัพธ์ต่อไปนี้ -
$./test.sh
Hello World
ส่งผ่านพารามิเตอร์ไปยังฟังก์ชัน
คุณสามารถกำหนดฟังก์ชันที่จะรับพารามิเตอร์ขณะเรียกใช้ฟังก์ชัน พารามิเตอร์เหล่านี้จะแสดงโดย$1, $2 และอื่น ๆ
ต่อไปนี้เป็นตัวอย่างที่เราส่งพารามิเตอร์สองตัวZaraและAliจากนั้นเราจับและพิมพ์พารามิเตอร์เหล่านี้ในฟังก์ชัน
#!/bin/sh
# Define your function here
Hello () {
echo "Hello World $1 $2"
}
# Invoke your function
Hello Zara Ali
เมื่อดำเนินการคุณจะได้รับผลลัพธ์ดังต่อไปนี้ -
$./test.sh
Hello World Zara Ali
การคืนค่าจากฟังก์ชัน
หากคุณรันไฟล์ exit คำสั่งจากภายในฟังก์ชันผลของมันไม่เพียง แต่ยุติการทำงานของฟังก์ชัน แต่ยังรวมถึงโปรแกรมเชลล์ที่เรียกฟังก์ชันด้วย
หากคุณต้องการยุติการทำงานของฟังก์ชันแทนก็มีวิธีที่จะออกมาจากฟังก์ชันที่กำหนดไว้
ขึ้นอยู่กับสถานการณ์คุณสามารถส่งคืนค่าใด ๆ จากฟังก์ชันของคุณโดยใช้ return คำสั่งที่มีไวยากรณ์ดังนี้ -
return code
ที่นี่ code อาจเป็นอะไรก็ได้ที่คุณเลือกที่นี่ แต่แน่นอนว่าคุณควรเลือกสิ่งที่มีความหมายหรือมีประโยชน์ในบริบทของสคริปต์ของคุณโดยรวม
ตัวอย่าง
ฟังก์ชันต่อไปนี้จะคืนค่า 10 -
#!/bin/sh
# Define your function here
Hello () {
echo "Hello World $1 $2"
return 10
}
# Invoke your function
Hello Zara Ali
# Capture value returnd by last command
ret=$?
echo "Return value is $ret"
เมื่อดำเนินการคุณจะได้รับผลลัพธ์ดังต่อไปนี้ -
$./test.sh
Hello World Zara Ali
Return value is 10
ฟังก์ชันที่ซ้อนกัน
อีกหนึ่งคุณสมบัติที่น่าสนใจของฟังก์ชั่นคือสามารถเรียกตัวเองและฟังก์ชันอื่น ๆ ฟังก์ชันที่เรียกตัวเองเรียกว่า arecursive function.
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการซ้อนกันของสองฟังก์ชัน -
#!/bin/sh
# Calling one function from another
number_one () {
echo "This is the first function speaking..."
number_two
}
number_two () {
echo "This is now the second function speaking..."
}
# Calling function one.
number_one
เมื่อดำเนินการคุณจะได้รับผลลัพธ์ดังต่อไปนี้ -
This is the first function speaking...
This is now the second function speaking...
ฟังก์ชั่นโทรจากพร้อมท์
คุณสามารถใส่คำจำกัดความสำหรับฟังก์ชันที่ใช้บ่อยในไฟล์ .profile. คำจำกัดความเหล่านี้จะพร้อมใช้งานเมื่อใดก็ตามที่คุณเข้าสู่ระบบและคุณสามารถใช้ได้ที่พรอมต์คำสั่ง
หรือคุณสามารถจัดกลุ่มคำจำกัดความในไฟล์ได้เช่น test.shจากนั้นเรียกใช้ไฟล์ในเชลล์ปัจจุบันโดยพิมพ์ -
$. test.sh
สิ่งนี้มีผลทำให้เกิดฟังก์ชันที่กำหนดไว้ภายใน test.sh ที่จะอ่านและกำหนดให้กับเชลล์ปัจจุบันดังนี้ -
$ number_one
This is the first function speaking...
This is now the second function speaking...
$
ในการลบนิยามของฟังก์ชันออกจากเชลล์ให้ใช้คำสั่ง unset กับ .fตัวเลือก คำสั่งนี้ยังใช้เพื่อลบนิยามของตัวแปรไปยังเชลล์
$ unset -f function_name