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 n tham 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
34
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 ng v 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 3-18 get_name.sh
#!/bin/sh yes_or_no() {
echo "In function parameters are $*" echo "Param 1 $1 and Param2 $2" while true
do
echo -n "Enter yes or no" read x
case "$x" in
y | yes ) return 0;; n | no ) return 1;; n | no ) return 1;;
* ) echo "Answer yes or no" esac
done }
echo "Original parameters are $*" 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
35 name".