Một hàm Bash về cơ bản là một tập hợp các lệnh có thể được gọi nhiều lần. Mục đích của một hàm là giúp bạn làm cho các tập lệnh bash của mình dễ đọc hơn và tránh việc viết cùng một đoạn mã lặp đi lặp lại. So với hầu hết các ngôn ngữ lập trình, các hàm Bash có phần hạn chế.
Trong hướng dẫn này, chúng tôi sẽ trình bày những điều cơ bản về các hàm Bash và chỉ cho bạn cách sử dụng chúng trong các tập lệnh shell của bạn.
Xác định các hàm Bash
Cú pháp để khai báo một hàm bash rất đơn giản. Các hàm có thể được khai báo ở hai định dạng khác nhau:
- Định dạng đầu tiên bắt đầu bằng tên hàm, theo sau là dấu ngoặc đơn. Đây là định dạng được ưa thích và sử dụng nhiều hơn.
function_name () { commands }
Phiên bản dòng đơn:function_name () { commands; }
- Định dạng thứ hai bắt đầu bằng từ dành riêng
function
, theo sau là tên hàm.function function_name { commands }
Phiên bản dòng đơn:function function_name { commands; }
Một số điểm cần lưu ý:
- Các lệnh giữa dấu ngoặc nhọn (
{}
) được gọi là phần thân của hàm. Các dấu ngoặc nhọn phải được phân cách với phần thân bằng dấu cách hoặc dòng mới. - Việc xác định một hàm không thực thi nó. Để gọi một hàm bash, chỉ cần sử dụng tên hàm. Các lệnh giữa các dấu ngoặc nhọn được thực thi bất cứ khi nào hàm được gọi trong tập lệnh shell.
- Định nghĩa hàm phải được đặt trước bất kỳ lệnh gọi hàm nào.
- Khi sử dụng các hàm “nén” một dòng, dấu chấm phẩy
;
phải theo sau lệnh cuối cùng trong hàm. - Luôn cố gắng giữ cho các tên chức năng của bạn mang tính mô tả.
Để hiểu rõ hơn điều này, hãy xem ví dụ sau:~ / hello_world.sh
#!/bin/bash hello_world () { echo 'hello, world' } hello_world
Hãy phân tích từng dòng mã:
- Trong dòng 3, chúng ta đang định nghĩa hàm bằng cách đặt tên cho nó. Dấu ngoặc nhọn
{
đánh dấu phần bắt đầu của phần thân của hàm. - Dòng
4
là cơ quan chức năng. Thân hàm có thể chứa nhiều lệnh, câu lệnh và khai báo biến. - Dòng
5
, dấu ngoặc nhọn đóng}
, xác định phần cuối của hàmhello_world
. - Trong dòng,
7
chúng ta đang thực hiện chức năng. Bạn có thể thực thi hàm nhiều lần nếu cần.
Nếu bạn chạy script, nó sẽ in hello, world
.
Phạm vi biến
Biến toàn cục là các biến có thể được truy cập từ bất kỳ đâu trong tập lệnh bất kể phạm vi. Trong Bash, tất cả các biến theo mặc định được định nghĩa là toàn cục, ngay cả khi được khai báo bên trong hàm.
Các biến cục bộ có thể được khai báo bên trong thân hàm bằng từ khóa local
và chỉ có thể được sử dụng bên trong hàm đó. Bạn có thể có các biến cục bộ có cùng tên trong các hàm khác nhau.
Để minh họa rõ hơn cách thức hoạt động của phạm vi biến trong Bash, hãy xem xét ví dụ sau:~ / variable_scope.sh
#!/bin/bash var1='A' var2='B' my_function () { local var1='C' var2='D' echo "Inside function: var1: $var1, var2: $var2" } echo "Before executing function: var1: $var1, var2: $var2" my_function echo "After executing function: var1: $var1, var2: $var2"
Tập lệnh bắt đầu bằng cách xác định hai biến toàn cục var1
và var2
. Sau đó, có một hàm đặt một biến cục bộ var1
và sửa đổi biến toàn cục var2
.
Nếu bạn chạy tập lệnh, bạn sẽ thấy kết quả sau:
Before executing function: var1: A, var2: B Inside function: var1: C, var2: D After executing function: var1: A, var2: D
Từ kết quả ở trên, chúng ta có thể kết luận rằng:
- Khi một biến cục bộ được đặt bên trong thân hàm có cùng tên với một biến toàn cục hiện có, nó sẽ được ưu tiên hơn biến toàn cục.
- Các biến toàn cục có thể được thay đổi từ bên trong hàm.
Giá trị trả lại
Không giống như các hàm trong ngôn ngữ lập trình “thực”, các hàm Bash không cho phép bạn trả về một giá trị khi được gọi. Khi một hàm bash hoàn thành, giá trị trả về của nó là trạng thái của câu lệnh cuối cùng được thực thi trong hàm, 0
đối với thành công và số thập phân khác 0 trong phạm vi 1 – 255 đối với thất bại.
Trạng thái trả về có thể được chỉ định bằng cách sử dụng từ khóa return
và nó được gán cho biến $?
. Câu lệnh return
kết thúc hàm. Bạn có thể coi đó là trạng thái thoát của hàm .~ / return_values.sh
#!/bin/bash my_function () { echo "some result" return 55 } my_function echo $?
Output:
some result 55
Để thực sự trả về một giá trị tùy ý từ một hàm, chúng ta cần sử dụng các phương thức khác. Tùy chọn đơn giản nhất là gán kết quả của hàm cho một biến toàn cục:~ / return_values.sh
#!/bin/bash my_function () { func_result="some result" } my_function echo $func_result
Output:
some result
Một tùy chọn khác, tốt hơn để trả về giá trị từ một hàm là gửi giá trị đến stdout
bằng cách sử dụng echo hoặc printf
như hình dưới đây:~ / return_values.sh
#!/bin/bash my_function () { local func_result="some result" echo "$func_result" } func_result="$(my_function)" echo $func_result
Output:
some result
Thay vì chỉ đơn giản thực hiện hàm sẽ in thông báo tới stdout, chúng ta sẽ gán đầu ra của hàm cho hàm func_result
bằng cách sử dụng $()
thay thế. Biến sau này có thể được sử dụng khi cần thiết.
Chuyển các đối số đến các hàm Bash
Để truyền bất kỳ số lượng đối số nào cho hàm bash, chỉ cần đặt chúng ngay sau tên của hàm, được phân tách bằng dấu cách. Một thực tiễn tốt là trích dẫn kép các đối số để tránh phân tích sai đối số có khoảng trắng trong đó.
- Các thông số thông qua được
$1
,$2
,$3
…$n
, tương ứng với vị trí của các tham số sau tên của chức năng. - Các
$0
biến được dành riêng cho tên của chức năng. - Các
$#
biến giữ số lượng tham số vị trí / đối số truyền cho hàm. - Các
$*
và$@
biến giữ tất cả các tham số / đối số vị trí được truyền cho hàm.- Khi được trích dẫn kép,
"$*"
mở rộng thành một chuỗi đơn được phân tách bằng dấu cách (ký tự đầu tiên của IFS) –"$1 $2 $n"
. - Khi được trích dẫn kép,
"$@"
mở rộng thành các chuỗi riêng biệt –"$1" "$2" "$n"
. - Khi không được trích dẫn kép,
$*
và$@
giống nhau.
- Khi được trích dẫn kép,
Đây là một ví dụ:~ / pass_arguments.sh
#!/bin/bash greeting () { echo "Hello $1" } greeting "Joe"
Output:
Hello Joe
Phần kết luận
Hàm Bash là một khối mã có thể sử dụng lại được thiết kế để thực hiện một thao tác cụ thể. Sau khi được định nghĩa, hàm có thể được gọi nhiều lần trong một tập lệnh.
Bạn cũng có thể muốn đọc về cách sử dụng hàm Bash để tạo một lệnh tắt dễ nhớ cho một lệnh dài hơn.
Nếu bạn có bất kỳ câu hỏi hoặc phản hồi nào, vui lòng để lại bình luận.