5.8 Shell - một ngôn ngữ lập trình
123
Điểm khác biệt nằm ở chỗ, sử dụng giá trị phủ định của điều kiện list1, tức
là list2 thực hiện, nếu câu lệnh cuối cùng trong danh sách list1 trả lại trạng
thái thoát ra khác không.
5.8.7
Các hàm số
Cú pháp
Hệ vỏ bash cho phép người dùng tạo các hàm số cho mình. Hàm số
làm việc và được sử dụng giống như các câu lệnh thông thường của hệ vỏ, tức là
chúng ta có thể tự tạo các câu lệnh mới. Hàm số có cấu trúc như sau:
function
name () { list }
Hơn nữa từ function không nhất thiết phải có, name xác định tên của hàm
(dùng để gọi hàm), còn phần thâm của hàm số tạo bởi danh sách các câu lệnh
list
, nằm giữa { và }. Các câu lệnh này sẽ được thực hiện mỗi khi tên name
được gọi (giống như một lệnh thông thường). Cần chú ý rằng hàm có thể là đệ
qui, tức là gọi hàm số ở ngay trong phần thân của nó. Hàm số thực hiện trong
phạm vi hệ vỏ hiện thời: không có tiến trình mới nào được chạy khi biên dịch
hàm số (khác với việc chạy script).
5.8.8
Tham số
Khi hàm số được gọi để thực hiện, các tham số của hàm sẽ trở thành các tham
biến vị trí (positional parameters, xem trên) trong thời gian thực hiện hàm
này. Chúng được đặt các tên như $n, trong đó n là số của tham số mà chúng ta
muốn sử dụng. Việc đánh số bắt đầu từ 1, như vậy $1 là tham số đầu tiên. Cũng
có thể sử dụng tất cả các tham số một lúc nhờ $*, và đưa ra số thứ tự của tham
số nhờ $# Tham số vị trí số 0 không thay đổi. Trong khi thực hiện nếu gặp câu
lệnh nội trú return (trong phần thân của hàm), thì hàm số sẽ bị dừng lại và
quyền điều khiển được trao cho câu lệnh đứng sau hàm. Khi thực hiện xong hàm
số, các tham biến vị trí và tham biến đậc biệt # sẽ được trả lại các giá trị mà
chúng có trước khi chạy hàm.
5.8.9
Biến nội bộ (local)
Nếu muốn tạo một tham biến địa phương, có thể sử dụng từ khóa local. Cú
pháp đưa ra biến địa phương giống hệt các tham biến khác, chỉ có điều cần đứng
sau từ khóa local: local name=value. Dưới đây là một ví dụ hàm số, thực
hiện công việc của lệnh seq đã nhắc đến ở trên:
seq()
{
local I=$1;
while [ $2 != $I ]; do
{
echo -n "$I ";
I=$(( $I + 1 ))