Viết Scripts 441
echo "/ tmp / tempstuff tìm thấy; hủy bỏ!
"exit
fi
đoạn này gây ra các kịch bản để thoát ra nếu các tập tin / tmp / tempstuffis hiện tại và lớn
hơn 0 byte. Các thenkeyword đánh dấu sự khởi đầu của một loạt các đường thẳng mà chỉ thực hiện nếu
có điều kiện là đúng, và fi (ifbackward) đánh dấu sự kết thúc của ifblock. Mã như vậy có thể
có ích nếu kịch bản tạo ra và sau đó xóa tập tin này, bởi vì sự hiện diện của nó chỉ ra
rằng một chạy trước của kịch bản đã không thành công hay vẫn được tiến hành.
Một hình thức thay thế cho một biểu thức điều kiện sử dụng testkeyword hơn là
dấu ngoặc vuông xung quanh các điều kiện:
nếu -s thử nghiệm / tmp / tempstuff
Bạn cũng có thể kiểm tra giá trị trả về của lệnh bằng cách sử dụng các lệnh như điều kiện:
nếu [command]
sau đó
thêm-lệnh
fi
Trong ví dụ này, thêm-commandswill được chỉ nếu commandcompletes chạy thành công. . Nếu commandreturns một mã lỗi, thêm-commandswon't được chạy
biểu thức có điều kiện có thể được mở rộng bằng cách sử dụng các elseclause:
nếu [có điều kiện biểu hiện]
sau đó
các lệnh
khác
khác-lệnh
fi
Mã của hình thức này gây ra hoặc commandsor khác-commandsto thực , tùy thuộc vào
việc đánh giá các điều kiện thể hiện. Điều này rất hữu ích nếu somethingshould xảy ra trong
một phần của chương trình mà chính xác là những gì nên xảy ra phụ thuộc vào một số điều kiện. Ví
dụ, bạn có thể muốn để khởi động một trong hai chương trình tập tin lưu trữ khác nhau tùy thuộc
vào đầu vào của người dùng.
Bạn làm gì nếu có nhiều hơn hai kết quả là có thể cho ví dụ, nếu một người sử dụng có thể
cung cấp bất kỳ một trong bốn yếu tố đầu vào có thể? Bạn có thể lồng nhiều nếu / rồi / elseclauses, nhưng điều này
được vụng rất nhanh chóng. Một cách tiếp cận sạch hơn là sử dụng trường hợp:
trường hợp từ trong
pattern1) lệnh (s) ;;
pattern2) lệnh (s) ;;
...
esac
442 Chương 9 ■ Scripts Viết, Cấu hình Email, và sử dụng cơ sở dữ liệu
Đối với một casestatement, một wordis có khả năng là một biến, và mỗi patternis một thể
giá trị của biến đó. Các mô hình có thể được mở rộng giống như tên tập tin, sử dụng cùng
các kí hiệu và quy tắc mở rộng (* đứng cho bất kỳ chuỗi, ví dụ). Bạn có thể phù hợp với một
số tùy ý của mô hình theo cách này. Mỗi tập hợp các câu lệnh phải kết thúc với một đôi
dấu chấm phẩy (;;), và các casestatement như một tổng thể kết thúc trong chuỗi esac (casebackward).
Khi thực hiện, bashexecutes các lệnh liên quan đến mô hình đầu tiên để phù hợp với
các từ. Thực hiện sau đó nhảy đến dòng sau esacstatement; bất kỳ can thiệp
lệnh không thực hiện. Nếu không có mô hình phù hợp với các văn bản, không có mã trong casestatement
thực hiện. Nếu bạn muốn có một điều kiện mặc định, sử dụng * như các mẫu thức; mô hình này
phù hợp với bất kỳ từ nào, vì vậy các lệnh của nó sẽ thực thi nếu không có patternmatches khác.
Sử dụng Loops
biểu thức điều kiện đôi khi được sử dụng trong vòng lặp. Loops là các cấu trúc cho các
kịch bản để thực hiện các nhiệm vụ cùng một lần cho đến khi một số điều kiện được đáp ứng (hoặc cho đến khi điều kiện là không còn đáp ứng). Ví dụ, Liệt kê 9.5 cho thấy một vòng lặp đóng tất cả các .wavaudio
tập tin trong một thư mục.
Listing 9.5: Một kịch bản thực thi một lệnh trên mỗi tập hợp trong một thư mục
# / bin / bash!
Cho d trong `ls * .wav` ; làm
aplay $ d
thực hiện
Các aplaycommand là một cầu thủ tập tin âm thanh cơ bản làm việc với các
chi tiết Linux Sound Kiến trúc (ALSA) trình điều khiển âm thanh. Trên một số hệ thống, bạn có thể cần phải sử dụng playor một số lệnh khác thay vì aplay.
Các forloop như được sử dụng ở đây thực hiện một lần cho tất cả các mục trong danh sách được tạo ra bởi ls * .wav.
Mỗi của những mặt hàng (tên tập tin) được gán lần lượt đến $ dvariable và như vậy được thông qua với
aplaycommand.
Các seqcommand có thể hữu ích trong việc tạo ra forloops (và theo những cách khác, quá): Đây
lệnh tạo ra một danh sách các số bắt đầu từ số đầu tiên của mình và tiếp tục của nó
cuối cùng. Ví dụ, gõ seq 1 10generates 10 dòng, mỗi dòng có một số nằm giữa 1
và 10. Bạn có thể sử dụng một forloop bắt đầu cho x trong `seq 1 10`to đã vòng lặp thực hiện
10 lần, với các giá trị của $ xincrementing với mỗi lần lặp . Nếu bạn vượt qua chỉ là một tham số để seq, nó diễn giải số đó như một điểm kết thúc, với điểm xuất phát là 1. Nếu
bạn vượt qua ba giá trị để seq, nó diễn giải chúng như là một giá trị bắt đầu, một số lượng tăng lên,
và một giá trị kết thúc.
Một loại vòng lặp là whileloop, mà thực hiện cho đến khi tình trạng của nó là
sự thật. Các hình thức cơ bản của loại vòng này là như thế này:
Scripts Viết 443
trong khi [điều kiện]
làm
lệnh
thực hiện
các untilloop là tương tự về hình thức, nhưng nó vẫn tiếp tục thực hiện cho đến khi tình trạng của mình
là sai-có nghĩa là, cho đến khi điều kiện trở thành sự thật.
Sử dụng các hàm
A functionis một phần của một kịch bản thực hiện một subtask cụ thể và có thể được gọi bằng
tên từ các bộ phận khác của kịch bản. Các hàm được định nghĩa bằng cách đặt dấu ngoặc đơn sau
tên hàm và kèm theo các đường tạo ra các chức năng trong dấu ngoặc nhọn:
myfn () {lệnh} Các functionmay từ khóa tùy chọn trước tên hàm. Trong cả hai trường hợp, các chức năng được gọi bằng cái tên như thể nó là một lệnh nội bộ hoặc bên ngoài bình thường. Chức năng này rất hữu ích trong việc giúp đỡ để tạo ra các kịch bản mô-đun. Ví dụ, nếu kịch bản của bạn cần thực hiện một nửa tá các tính toán riêng biệt, bạn có thể đặt từng tính toán trong một hàm và sau đó gọi tất cả chúng theo thứ tự. Bảng liệt kê 9.6 cho thấy việc sử dụng các chức năng trong một chương trình đơn giản mà các bản sao một tập tin nhưng hủy bỏ với một thông báo lỗi nếu tập tin đích đã tồn tại. Kịch bản này chấp nhận một mục tiêu và một tên tập tin đích và phải vượt qua những tên tập tin đến các chức năng. Listing 9.6: Một kịch bản chứng minh việc sử dụng các chức năng # / bin / bash số tiền rất ít () {cp $ 1 $ 2} chức năng kiểm tra () {if [-s $ 2] sau đó echo "tập tin mục tiêu tồn tại! Thoát khỏi! "Exit fi} kiểm tra $ 1 $ 2 số tiền rất ít $ 1 $ 2
đang được dịch, vui lòng đợi..
