Các hàm Shell

Các hàm cho phép bạn tinh giản một tính năng tổng thể của một script vào một phần nhỏ và logic hơn mà có thể thực hiện cùng một chức năng bất cứ khi nào nó được cần thông qua việc gọi hàm.

Sử dụng các hàm để thực hiện các công việc mang tính lặp là một cách thông minh để tạo tính sử dụng lại được của code. Tính sử dụng lại của code là một phần quan trọng của các quy tắc chương trình hướng đối tượng hiện đại.

Các hàm Shell là tương tự như các chương trình con, phương thức và các hàm của các chương trình khác.

Tạo các hàm trong Unix/Linux

Để công bố một hàm, đơn giản bạn sử dụng cú pháp sau:

function_name () { 
   list of commands
}

Tên hàm của bạn là function_name, và nó là những gì mà bạn sẽ sử dụng để gọi nó từ bất cứ đâu trong script của bạn. Tên hàm phải được theo sau bởi dấu ngoặc đơn, mà được theo sau bởi một danh sách các lệnh bao quanh trong dấu ngoặc ôm ({}).

Ví dụ:

Sau đây là ví dụ đơn giản của việc sử dụng hàm:

#!/bin/sh

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

# Invoke your function
Hello

Khi bạn chạy script trên, nó sẽ tạo ra kết quả sau:

$./test.sh
Hello World
$

Truyền các tham số cho một hàm trong Unix/Linux

Bạn có thể định nghĩa một hàm mà sẽ nhận các tham số trong khi gọi các hàm đó. Những tham số này sẽ có thể được đại diện bởi $1, $2 và…

Dưới đây là ví dụ mà chúng ta truyền hai tham số Zara và Ali và sau đó chúng ta bắt 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

Code này sẽ tạo ra kết quả sau:

$./test.sh
Hello World Zara Ali
$

Trả lại các giá trị từ một hàm trong Unix/Linux

Nếu bạn chạy một lệnh exit từ bên trong một hàm, hiệu quả của nó là không chỉ kết thúc sự vận hành của hàm mà còn của chương trình Shell.

Nếu bạn thay cho muốn kết thúc sự vận hành của hàm, thì có cách để thoát khỏi một hàm đã định nghĩa.

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

return code

Ở đây code có thể là bất cứ cái gì mà bạn chọn, nhưng rõ ràng là bạn nên chọn một cái gì đó mà có nghĩa hoặc hữu ích trong bối cảnh tổng thể script của bạn.

Ví dụ:

Hàm dưới đây trả lại giá trị 1.

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

Code trên tạo ra kết quả sau:

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

Các hàm được lồng vào nhau trong Unix/Linux

Một trong những đặc điểm đáng quan tâm của các hàm là chúng có thể là chúng có thể gọi chính hàm đó hoặc gọi các hàm khác. Một hàm có thể gọi chính nó được biết đến như hàm đệ quy.

Dưới đây là ví dụ giải thích sự lồng vào nhau của 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

Nó sẽ tạo ra kết quả sau:

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

Gọi hàm từ dòng nhắc lệnh trong Unix/Linux

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

Bạn cũng có thể chọn cách tạo nhóm các định nghĩa hàm này vào trong một file, gọi là test.sh, và sau đó chạy file trên Shell hiện tại bằng cách gõ từ bàn phím.

$. test.sh

Điều này có thể thực hiện được khi các hàm trong file này có thể cho phép đọc và nó được xác định trong Shell hiện tại như sau:

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

Để gỡ bỏ một định nghĩa hàm từ Shell hiện tại, bạn có thể sử dụng lệnh unset với chức năng .f. Nó giống với lệnh mà bạn sử dụng để gỡ bỏ định nghĩa một biến từ Shell.

$unset .f function_name