Viết kịch bản 441echo "/ tmp/tempstuff tìm thấy; aborting!"lối raFiMảnh này gây ra kịch bản để thoát khỏi nếu tập tin/tmp/tempstuffis trình bày và là lớn hơn hơn 0 byte. Thenkeyword đánh dấu sự khởi đầu của một loạt các dây chuyền thực hiện chỉ khi 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ể thể hữu ích nếu các kịch bản tạo ra và rồi sau đó xoá tệp này, bởi vì sự hiện diện của nó cho thấy rằng một chạy trước của kịch bản không thành công hoặc vẫn đang thực hiện.Một hình thức thay thế cho một biểu hiện có điều kiện sử dụng testkeyword thay vì dấu ngoặc vuông xung quanh có điều kiện:nếu kiểm tra -s /tmp/tempstuffBạn cũng có thể kiểm tra giá trị trả lại một lệnh bằng cách sử dụng lệnh như là điều kiện:Nếu [lệnh]sau đólệnh bổ sungFiTrong ví dụ này, bổ sung commandswill chạy chỉ khi commandcompletes thành công. Nếu commandreturns một mã lỗi, bổ sung commandswon't được chạy.Biểu hiện có điều kiện có thể được mở rộng bằng cách sử dụng elseclause:Nếu [có điều kiện biểu hiện]sau đólệnhkháckhác-lệnhFiQuy tắc này nguyên nhân hình thức hoặc khác – commandsor commandsto thực hiện, tùy thuộc vào đánh giá các biểu hiện có điều kiện. Điều này là hữu ích nếu somethingshould xảy ra trong một phần của chương trình nhưng chính xác những gì sẽ xảy ra phụ thuộc vào một số điều kiện. Cho Ví dụ, bạn có thể muốn để khởi động một trong hai khác nhau tập tin lưu trữ chương trình tùy thuộc trên đầu vào của người dùng.Những gì bạn làm nếu nhiều hơn hai kết quả là có thể-ví dụ, nếu một người sử dụng có thể cung cấp cho bất kỳ một trong bốn có thể đầu hàng vào? Bạn có thể làm tổ một số nếu/đó/elseclauses, nhưng điều này được khó khăn 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ừ trongpattern1) command(s);pattern2) command(s);...esac442 chương 9 ■ viết kịch bản, cấu hình Email, và bằng cách sử dụng cơ sở dữ liệuCho một casestatement, một wordis có khả năng là một biến, và mỗi patternis một tốt 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 một ký tự đại diện và mở rộng quy tắc (* đứ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 các mô hình theo cách này. Mỗi tập các lệnh phải kết thúc với một đôi dấu chấm phẩy (;), và casestatement như một toàn thể kết thúc trong chuỗi esac(casebackward).Khi thực hiện, bashexecutes lệnh liên kết với các mô hình đầu tiên để phù hợp với từ. Thực hiện sau đó nhảy vào 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 từ, không có mã số trong vòng casestatement thực hiện. Nếu bạn muốn có một tình trạng mặc định, sử dụng * như các mô hình cuối cùng; Mô hình này phù hợp với bất kỳ từ nào, do đó, lệnh của nó sẽ thực hiện nếu không có patternmatches khác.Sử dụng các vòngBiểu hiện có điều kiện đôi khi được sử dụng trong vòng. Vòng là cấu trúc cho biết các kịch bản để thực hiện nhiệm vụ tương tự nhiều lần cho đến khi một số điều kiện được đáp ứng (hoặc cho đến khi một số điều kiện không còn gặp). Ví dụ, danh sách 9.5 cho thấy một vòng lặp đóng tất cả .wavaudio tập tin trong một thư mục.Danh sách 9.5: Một kịch bản thực hiện một lệnh vào mỗi tập tin phù hợp trong một thư mục#! / bin/bashd trong ' ls * .wav '; làmaplay $dthực hiệnAplaycommand là một cầu thủ tập tin âm thanh cơ bản mà làm việc với các Nâng cao kiến trúc âm thanh Linux (ALSA) đ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.Forloop như được sử dụng ở đây thực hiện một lần cho mỗi mục trong danh sách được tạo ra bởi ls *.wav. Mỗi người trong số những mặt hàng (tên tập tin) được gán các lần lượt để $dvariable và vì vậy được truyền cho các aplaycommand.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ừ đối số đầu tiên của nó và tiếp tục của nó cuối cùng. Ví dụ, gõ seq 1 10generates 10 dòng, mỗi với một số giữa 1 và 10. Bạn có thể sử dụng một khởi đầu forloop với x trong ' seq 1 10' có vòng lặp thực hiện 10 lần, với giá trị của $xincrementing với mỗi iteration. Nếu bạn vượt qua chỉ là một tham số để seq, nó dịch số như là một điểm kết thúc, với điểm khởi đầu là 1. Nếu bạn vượt qua ba giá trị để seq, nó dịch chúng như là một giá trị bắt đầu, một số tiền tăng, 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 miễn là điều kiện của nó là sự thật. Các hình thức cơ bản của vòng loại là như thế này:Viết kịch bản 443trong khi [điều kiện]làmlệnhthực hiệnUntilloop tương tự như trong hình thức, nhưng nó tiếp tục thực hiện càng lâu như tình trạng của nó là sai-có nghĩa là, cho đến khi điều kiện trở thành sự thật.Bằng cách sử dụng chức năngMột functionis một phần của một kịch bản thực hiện một nhiệm vụ con cụ thể và rằng có thể được gọi là tên từ các bộ phận khác của kịch bản. Chức năng được xác định bằng cách đặt dấu ngoặc đơn sau khi các chức năng tên và kèm theo dòng tạo nên các chức năng trong niềng răng xoăn:myfn() {}lệnh}Functionmay từ khóa tùy chọn đứng trước tên chức năng. Trong một trong hai trường hợp, các chức năng được gọi là của 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 là rất hữu ích trong việc giúp đỡ để tạo ra mô-đun kịch bản. Ví dụ, nếu kịch bản của bạn cần phải thực hiện một nửa tá các tính toán khác biệt, bạn có thể đặt mỗi tính toán trong một hoạt động và sau đó gọi cho họ tất cả theo thứ tự. Danh sách 9.6 chứng tỏ việc sử dụng các chức năng trong một chương trình đơn giản sao chép một tập tin nhưng aborts với một thông báo lỗi nếu mục tiêu tập tin đã 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.Danh sách 9.6: Một kịch bản chứng minh việc sử dụng các chức năng#/ bin/bashdoit() {}CP $1 $2}chức năng check() {}Nếu [-s $2]sau đóecho "Tệp đích tồn tại! Thoát!"lối raFi}kiểm tra $1 $2doit $1 $2
đang được dịch, vui lòng đợi..
![](//viimg.ilovetranslation.com/pic/loading_3.gif?v=b9814dd30c1d7c59_8619)