Unix / Linux - Hàm Shell

Trong chương này, chúng ta sẽ thảo luận chi tiết về các hàm shell. Các chức năng cho phép bạn chia chức năng tổng thể của một tập lệnh thành các tiểu mục nhỏ hơn, hợp lý, sau đó có thể được gọi để thực hiện các nhiệm vụ riêng lẻ của chúng khi cần thiết.

Sử dụng các hàm để thực hiện các tác vụ lặp đi lặp lại là một cách tuyệt vời để tạo code reuse. Đây là một phần quan trọng của các nguyên tắc lập trình hướng đối tượng hiện đại.

Các hàm Shell tương tự như các chương trình con, thủ tục và hàm trong các ngôn ngữ lập trình khác.

Tạo các chức năng

Để khai báo một hàm, chỉ cần sử dụng cú pháp sau:

function_name () { 
   list of commands
}

Tên chức năng của bạn là function_namevà đó là những gì bạn sẽ sử dụng để gọi nó từ nơi khác trong tập lệnh của mình. Tên hàm phải được đặt sau dấu ngoặc đơn, theo sau là danh sách các lệnh được đặt trong dấu ngoặc nhọn.

Thí dụ

Ví dụ sau đây cho thấy việc sử dụng hàm:

#!/bin/sh

# Define your function here
Hello () {
   echo "Hello World"
}

# Invoke your function
Hello

Khi thực hiện, bạn sẽ nhận được kết quả sau:

$./test.sh
Hello World

Chuyển các tham số cho một hàm

Bạn có thể xác định một hàm sẽ chấp nhận các tham số trong khi gọi hàm. Các thông số này sẽ được đại diện bởi$1, $2 và như thế.

Dưới đây là một ví dụ mà chúng ta truyền hai tham số ZaraAli , sau đó chúng ta chụp và in các tham số này trong hàm.

#!/bin/sh

# Define your function here
Hello () {
   echo "Hello World $1 $2"
}

# Invoke your function
Hello Zara Ali

Khi thực hiện, bạn sẽ nhận được kết quả sau:

$./test.sh
Hello World Zara Ali

Trả lại giá trị từ các hàm

Nếu bạn thực hiện một exit lệnh từ bên trong một hàm, tác dụng của nó không chỉ là chấm dứt việc thực thi hàm mà còn đối với chương trình shell được gọi là hàm.

Thay vào đó, nếu bạn chỉ muốn chấm dứt việc thực thi hàm, thì có cách để thoát ra khỏi một hàm đã xác định.

Dựa trên tình huống, bạn có thể trả về bất kỳ giá trị nào từ hàm của mình bằng cách sử dụng return lệnh có cú pháp như sau:

return code

Đây code có thể là bất cứ thứ gì bạn chọn ở đây, nhưng rõ ràng bạn nên chọn thứ gì đó có ý nghĩa hoặc hữu ích trong bối cảnh toàn bộ tập lệnh của bạn.

Thí dụ

Hàm sau trả về giá trị 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"

Khi thực hiện, bạn sẽ nhận được kết quả sau:

$./test.sh
Hello World Zara Ali
Return value is 10

Các hàm lồng nhau

Một trong những tính năng thú vị hơn của các hàm là chúng có thể tự gọi mình và cả các hàm khác. Một hàm gọi chính nó được gọi làrecursive function.

Ví dụ sau minh họa việc lồng hai hàm:

#!/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

Khi thực hiện, bạn sẽ nhận được kết quả sau:

This is the first function speaking...
This is now the second function speaking...

Chức năng Gọi từ Lời nhắc

Bạn có thể đặt các định nghĩa cho các hàm thường được sử dụng bên trong .profile. Các định nghĩa này sẽ có sẵn bất cứ khi nào bạn đăng nhập và bạn có thể sử dụng chúng tại dấu nhắc lệnh.

Ngoài ra, bạn có thể nhóm các định nghĩa trong một tệp, chẳng hạn test.sh, và sau đó thực thi tệp trong trình bao hiện tại bằng cách nhập -

$. test.sh

Điều này có tác dụng gây ra các chức năng được xác định bên trong test.sh được đọc và xác định với shell hiện tại như sau:

$ number_one
This is the first function speaking...
This is now the second function speaking...
$

Để xóa định nghĩa của một hàm khỏi shell, hãy sử dụng lệnh unset với .fLựa chọn. Lệnh này cũng được sử dụng để loại bỏ định nghĩa của một biến đối với trình bao.

$ unset -f function_name