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