3. Cú pháp ngôn ngữ shell
3.5.2 Hàm và cách truyền tham số
Shell không có cách khai báo tham số cho hàm như cách của C, Pascal hay các ngôn ngữ lập trình thông thường khác. Việc truyền tham số cho hàm tương tự như truyềntham số trên dùng lệnh. Ví dụ để truyền tham số cho foo(), ta gọi hàm như sau:
foo "paraml", "param2", param3 . . .
Vậy làm cách nào hàm nhận và lấy về được nội dung đối số truyền cho nó? Bên trong hàm, ta gọi các biến môi trường $*, $1, $2 ... chúng chính là các đối số truyền vào khi hàm được gọi. Lưu ý, nội dung của $*, $1, $2 do biến môi trường nắm giữ sẽ được shell tạm thời cất đi. Một khi hàm chấm dứt, các giá trị cũ sẽ được khôi phục lại.
Mặc dù vậy, có một số shell cũ trên UNIX không phục hồi tham số môi trường vềgiá trị ban đầu khi hàm kết thúc. Nếu muốn bảo đảm, hãy nên tự lưu trữ các biến tham số môi trường trước triệu gọi hàm. Tuy nhiên các shell mới và nhất là nếu chỉ muốn hướngvề Linux, thì không cần lo lắng điều này.
Dưới đây là một ví dụ cho thấy cách gọi và nhận trị trả về của hàm đồng thời xử lý đối số truyền cho hàm được gọi.
Ví dụ tạo một script có tên là: get_name.sh !#/bin/sh
yes_or_no() {
echo "In function parameters are $*" echo "Param 1 $1 and Param2 $2" while true
do
read x case "$x" in
y | yes ) return 0;; n | no ) return 1;;
* )echo "Answer yes or no" esac
done }
echo “Original parameter are S*” if yes_or_no "Is your name” “ $1?" then
echo "Hi $1" elif
echo "Never mind" fi
exit 0
Kết quả kết xuất khi gọi lệnh như sau: $,/get_name.sh HoaBinh SV
Original parameters are HoaBinh SV
In function parameters are Is your name HoaBinh Param 1 Is your name param 2 HoaBinh
Is your name HoaBinh ? Enter yes or no : yes Hi HoaBinh, nice name
Cách làm làm việc: Hàm yes_or_no( ) được định nghĩa khi script thực thi nhưng chưa được gọi. Trong mệnh đề if, hàm yes_or_no được sử dụng với tham số truyền cho ham là nội dung của biến môi trường thứ nhất (ở ví dụ trên $1 được thay thế bằng HoaBinh) và chuỗi “Is your name”. Bên trong hàm nội dung của $1 và $2 được in ra (Hãy để ý là chúng khác với giá trị $1, $2 của môi trường shell ban đầu). Hàm yes_or_no xây dựng cấu trúc case tùy theo lựa chọn của người dùng mà trả vế trị 0 hay 1. Khi người dùng chọn yes, hàm trá về giá trị 0 (true). Lệnh bên trong if được gọi để in ra chuỗi “nice name”