Chức năng Bash
Trong chủ đề này, chúng ta đã giải thích cơ bản về các chức năng của bash và cách chúng hoạt động trong việc lập trình shell.
Các chức năng trong lập trình shell là một tùy chọn tuyệt vời để sử dụng lại code. Một chức năng Bash có thể được xác định là một tập hợp các lệnh có thể được gọi nhiều lần trong kịch bản shell. Mục đích của chức năng trong bash là giúp bạn làm cho code của bạn dễ đọc hơn và tránh việc viết lại code giống nhau một cách liên tục. Nó cũng cho phép các nhà phát triển phân chia code phức tạp và dài thành các phần nhỏ có thể được gọi bất cứ khi nào cần thiết. Chức năng có thể được gọi bất kỳ lúc nào và nhiều lần, cho phép chúng ta tái sử dụng, tối ưu hóa và giảm code.
Dưới đây là một số điểm chính về các chức năng bash:
- Một chức năng phải được khai báo trong kịch bản shell trước khi chúng ta có thể sử dụng nó.
- Đối số có thể được truyền vào các chức năng và được truy cập bên trong chức năng dưới dạng $1, $2,…
- Các biến cục bộ có thể được gán bên trong chức năng và phạm vi của các biến đó chỉ là chức năng đặc biệt đó.
- Các lệnh tích hợp của Bash shell có thể bị ghi đè bằng các chức năng.
Cú pháp:
Cú pháp để khai báo một chức năng bash có thể được xác định theo hai định dạng:
- Phương pháp đầu tiên bắt đầu bằng tên chức năng, theo sau là dấu ngoặc đơn. Đây là phương pháp phổ biến nhất và được sử dụng thường xuyên nhất:
function_name () {
commands
}
Phiên bản trên một dòng có thể được đề cập như sau:
function_name () { commands; }
- Phương pháp thứ hai bắt đầu với từ khóa function, theo sau là tên của hàm:
function function_name {
commands
}
Phiên bản một dòng có thể được đề cập như sau:
function function_name { commands; }
So sánh với hầu hết các ngôn ngữ lập trình, các hàm trong Bash có một số hạn chế. Hãy hiểu khái niệm này thông qua một số ví dụ:
Ví dụ cho phương pháp 1:
#!/bin/bash
JTP () {
echo 'Welcome to Javatpoint.'
}
JTP
Kết quả
Welcome to Javatpoint.
Ví dụ cho phương pháp 2:
#!/bin/bash
function JTP {
echo 'Welcome to Javatpoint.'
}
JTP
Kết quả
Welcome to Javatpoint.
Passing Arguments (Truyền tham số)
Tương tự như hầu hết các ngôn ngữ lập trình, chúng ta cũng có thể truyền tham số và xử lý dữ liệu trong các hàm bash. Chúng ta có thể chèn dữ liệu vào hàm theo cách tương tự như truyền các tham số dòng lệnh vào một tập lệnh bash.
Để truyền bất kỳ số lượng tham số nào vào hàm bash, chúng ta cần chèn chúng ngay sau tên của hàm. Chúng ta phải áp dụng khoảng cách giữa tên hàm và các tham số. Sử dụng dấu ngoặc kép để bao quanh các tham số là một lựa chọn tuyệt vời để ngăn cản việc phân tích sai các tham số có khoảng trắng trong đó.
Sau đây là một số điểm quan trọng về việc truyền tham số cho các hàm bash:
- Các tham số được cung cấp được truy cập dưới dạng $1, $2, $3 … $n, tương ứng với vị trí của các tham số sau tên hàm.
- Biến $0 được giữ trống để lưu tên của hàm.
- Biến $# được sử dụng để lưu số lượng tham số được đưa vào hàm.
- Biến $* và $@ được sử dụng để lưu tất cả các đối số/ tham số được đưa vào hàm.
- Khi $* được sử dụng với dấu ngoặc kép (tức là, “$”), nó mở rộng thành một chuỗi duy nhất được phân tách bằng khoảng trắng. Ví dụ, “$1 $2 $n etc”.
- Khi $@ được sử dụng với dấu ngoặc kép (tức là, “$@”), nó mở rộng thành các chuỗi riêng biệt. Ví dụ, “$1” “$2” “$n” v.v.
- Khi $ và $# không được sử dụng với dấu ngoặc kép, chúng đều giống nhau.
Dưới đây là code mẫu minh họa quy trình cách truyền đối số cho hàm và truy cập các đối số trong hàm.
#!/bin/bash
#Script to pass and access arguments
function_arguments()
{
echo $1
echo $2
echo $3
echo $4
echo $5
}
#Calling function_arguments
function_arguments "We""welcome""you""on""Javatpoint."
Kết quả
Trong kịch bản này, chúng ta đã thêm các giá trị “We”, “welcome”, “you”, “on” và “Javatpoint” sau khi đã gọi hàm function_arguments. Những giá trị này được truyền vào function_arguments dưới dạng tham số và được lưu trữ trong một biến cục bộ. Tuy nhiên, khác với các ngôn ngữ khác, trình thông dịch lưu trữ các giá trị được truyền vào trong các biến được định nghĩa trước đó, được đặt tên theo thứ tự của các tham số truyền vào.
Ví dụ,
“Từ” “We” được lưu trữ vào biến 1.
“Từ” “welcome” được lưu trữ vào biến 2.
“Từ” “you” được lưu trữ vào biến 3.
“Từ” “on” được lưu trữ vào biến 4.
“Từ” “Javatpoint” được lưu trữ vào biến 5.
Phạm vi biến
Biến toàn cục được định nghĩa là các biến có thể được truy cập bất cứ nơi nào trong kịch bản bất kể phạm vi. Mặc định, tất cả các biến đều được định nghĩa là biến toàn cục, ngay cả khi chúng được khai báo bên trong hàm. Chúng ta cũng có thể tạo biến là biến cục bộ. Biến cục bộ có thể được khai báo bên trong thân hàm với từ khóa “local” khi chúng được gán cho lần đầu tiên. Chúng chỉ có thể được truy cập trong phạm vi hàm đó. Chúng ta có thể tạo các biến cục bộ có cùng tên trong các hàm khác nhau. Để thêm một biến cục bộ, chúng ta có thể sử dụng cú pháp sau:
local var_name=<var_value>
Để hiểu rõ hơn về cách hoạt động của phạm vi biến trong Bash Scripting, hãy xem ví dụ sau:
#!/bin/bash
v1='A'
v2='B'
my_var () {
local v1='C'
v2='D'
echo "Inside Function"
echo "v1 is $v1."
echo "v2 is $v2."
}
echo "Before Executing the Function"
echo "v1 is $v1."
echo "v2 is $v2."
my_var
echo "After Executing the Function"
echo "v1 is $v1."
echo "v2 is $v2."
Kết quả
Giá trị trả về
Hầu hết các ngôn ngữ lập trình đều có khái niệm trả về giá trị cho các hàm. Điều đó có nghĩa là hàm phải gửi dữ liệu trở lại vị trí gọi ban đầu. Không giống như các ngôn ngữ lập trình “thực sự”, Bash function không cung cấp hỗ trợ để trả về một giá trị khi nó được gọi. Tuy nhiên, chúng cho phép chúng ta thiết lập một trạng thái trả về tương tự như cách một chương trình hoặc lệnh thoát với trạng thái thoát. 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. Nó trả về 0 cho trạng thái thành công và số thập phân không nằm trong khoảng 1-255 cho 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 trả về kết thúc hàm và hoạt động như trạng thái thoát của hàm.
Ví dụ, xem xét đoạn mã sau:
#!/bin/bash
#Setting up a return status for a function
print_it () {
echo Hello $1
return 5
}
print_it User
print_it Reader
echo The previous function returned a value of $?
Kết quả
Một lựa chọn tốt hơn để trả về một giá trị từ một hàm là gửi giá trị đó tới stdout bằng cách sử dụng các lệnh echo hoặc printf, như được thể hiện dưới đây:
#!/bin/bash
print_it () {
local my_greet="Welcome to Javatpoint."
echo "$my_greet"
}
my_greet="$(print_it)"
echo $my_greet
Kết quả
Welcome to Javatpoint.
Ghi đè Lệnh
Chúng ta có thể ghi đè các lệnh bash bằng cách tạo một hàm với cùng tên với lệnh mà chúng ta muốn ghi đè. Ví dụ, nếu chúng ta muốn ghi đè lệnh ‘echo’, thì chúng ta phải tạo một hàm có tên là ‘echo’.
Khái niệm ghi đè lệnh bash này có thể hữu ích trong một số tình huống như khi chúng ta muốn sử dụng một lệnh với các tùy chọn cụ thể. Ngoài ra, khi chúng ta không muốn cung cấp toàn bộ lệnh với các tùy chọn nhiều lần trong kịch bản. Trong những trường hợp như vậy, chúng ta có thể ghi đè lệnh bash tích hợp cho lệnh có tùy chọn. Bây giờ, hãy hiểu khái niệm ghi đè lệnh trong Bash Shell Scripting với sự trợ giúp của một số ví dụ sau:
Ví dụ
Trong ví dụ này, chúng ta đã ghi đè lệnh ‘echo’ và thêm dấu thời gian dưới dạng đối số cho lệnh ‘echo’.
#!/bin/bash
#Script to override command using function
echo () {
builtin echo -n `date +"[%m-%d %H:%M:%S]"` ": "
builtin echo $1
}
echo "Welcome to Javatpoint."
Kết quả
Kết luận
Trong chủ đề này, chúng ta đã thảo luận về Bash Function. Một hàm Bash được coi là một khối mã có thể tái sử dụng được phát triển để thực hiện một thao tác cụ thể. Một khi nó được xác định, nó có thể được gọi nhiều lần trong một tập lệnh.