Vòng lặp Bash 'For': Hướng dẫn và Ví dụ

Bash (Bourne Again Shell) là một lời nhắc lệnh shell và ngôn ngữ kịch bản trong hệ điều hành GNU / Linux. Nó là trình bao mặc định cho hầu hết các bản phân phối Linux.

Giống như hầu hết các ngôn ngữ kịch bản, Bash cung cấp các cú pháp vòng lặp để lặp lại các tác vụ tương tự nhiều lần. Trong bài viết này, chúng ta sẽ học cách sử dụng vòng lặp trong Bash.

Giới thiệu

Một tập lệnh Bash điển hình chứa một loạt các lệnh được thực hiện lần lượt. Các biến có thể được sử dụng để lưu trữ chuỗi, giá trị chỉ số nguyên, kết quả của một lệnh, v.v. Cần phải có vòng lặp khi người dùng muốn thực hiện một lệnh cụ thể nhiều lần. Nó được sử dụng đặc biệt khi đầu ra của một lệnh ở dạng danh sách và trên mỗi kết quả, trong danh sách, lệnh thứ hai sẽ được chạy.

Cú pháp chung

Cú pháp chung cho vòng lặp trong Bash là:

để làm ... ... xong

Đây, là một biến Bash, phải là một tên biến shell Linux hợp lệ, tức là tên chứa sự kết hợp của các chữ cái (az, AZ), số (0-9) và dấu gạch dưới (_) và nó phải bắt đầu bằng một chữ cái hoặc dấu gạch dưới.

Các là một phạm vi tùy chỉnh của chỉ số số nguyên sẽ được lặp lại hoặc danh sách tùy chỉnh các số nguyên hoặc chuỗi. Nó cũng có thể chứa một lệnh Linux khác, tuy nhiên, đầu ra của lệnh đó phải được phân tách bằng dấu cách hoặc ký tự dòng mới, tức là có thể phân tích cú pháp bằng Bash thành một danh sách (Một danh sách trong Bash về cơ bản là một tập hợp các giá trị được phân tách bằng dấu cách hoặc dòng mới ).

Bất kỳ (các) lệnh nào được thực hiện phải được đặt bên trong làm xong khối.

Hãy để chúng tôi xem một vài ví dụ đơn giản.

Vòng lặp trên một phạm vi giá trị Số nguyên: Đoạn mã sau tạo các thư mục có tên dir1, dir2, dir3 cho đến dir10.

cho tôi trong {1..10} làm mkdir dir $ tôi đã hoàn thành

Vòng lặp trên danh sách các giá trị cố định: Đoạn mã sau in từng chuỗi hoặc số nguyên trong danh sách cố định đã cho.

cho tôi trong Xin chào 1 2 3 Tạm biệt! làm echo $ tôi đã hoàn thành

Vòng lặp trên đầu ra của một lệnh: Đoạn mã sau lặp lại trên kết quả đầu ra của ls và in tên của từng tệp theo định dạng đã cho.

for i in `ls` do echo" Tên tệp là $ i "xong

Cú pháp dựa trên biểu thức

Một cú pháp dựa trên biểu thức tương tự như ngôn ngữ lập trình C cũng có thể sử dụng được trong Bash:

for ((Biểu thức 1; Biểu thức 2; Biểu thức 3)) làm ... ... xong

Nơi đây, Biểu thức 1 là lần khởi tạo (các) biến chỉ số. Biểu thức 2 là điều kiện khi vòng lặp phải được thoát ra; điều kiện này được kiểm tra trong mỗi lần lặp. Biểu thức 3 chỉ định sự gia tăng / giảm / sửa đổi giá trị của (các) biến chỉ số

Ví dụ sau chỉ cần in các giá trị từ 0 đến 4:

for ((i = 0; i <5; i ++)) do echo $ i done

Ví dụ sau tạo một vòng lặp vô hạn, vì không có biểu thức nào được chỉ định:

for ((;;)) do echo "Nhấn Ctrl-C để dừng" xong

Ngắt và tiếp tục

Tuyên bố ngắt cho thoát có điều kiện

Chúng ta cũng có thể sử dụng câu lệnh điều kiện nếu như bên trong vòng lặp. Các nếu như câu lệnh có thể được sử dụng với nghỉ câu lệnh, để thoát có điều kiện khỏi vòng lặp.

for ((i = 0; i <10; i ++)) do if [[$ i -eq 5]] then break else echo $ i; xong rồi

Vòng lặp trên sẽ in ra các số từ 0 đến 4. Sau đó khi giá trị của i là 5, nó sẽ thoát ra khỏi vòng lặp. Điều này đặc biệt được sử dụng khi một vòng lặp được thoát ra khi một lệnh đưa ra một đầu ra cụ thể. Ví dụ, vòng lặp sau đây sẽ ngắt nếu và khi nó tìm thấy một tệp trống.

for file in `ls` do flen =` wc -c $ file` if [["$ flen" = "0 $ file"]] then echo "$ file trống" break else echo $ flen fi xong 

Lệnh wc -c in số dòng trong tệp . Nó in nó ở định dạng , Ví dụ, 10 test.txt. Chúng tôi đang thoát ra khỏi vòng lặp khi số dòng là 0, tức là một tệp trống.

Tiếp tục tuyên bố để bỏ qua một lần lặp lại có điều kiện

Tương tự như C và nhiều ngôn ngữ lập trình khác, bash cũng có tiếp tục để bỏ qua phần còn lại của một lần lặp trong vòng lặp nếu một điều kiện cụ thể được thỏa mãn.

for ((i = 0; i <10; i ++)) do if [[$ i -eq 5]] then continue fi echo $ i; làm xong

Vòng lặp trên sẽ in ra các số từ 0 đến 10, ngoại trừ 5, bởi vì trong quá trình lặp lại của i = 5 có một câu lệnh continue, câu lệnh này sẽ bỏ qua phần còn lại của mã trong vòng lặp khi bắt đầu với sự lặp lại của i = 6.

Trong ví dụ sau, chúng tôi in số dòng trong một tệp và một lần lặp cụ thể sẽ tiếp tục nếu nó là một thư mục và không phải là một tập tin.

cho tệp trong `ls` do if [[-d $ file]] rồi tiếp tục fi wc -c" $ file "xong

[[-d $ file]] kiểm tra xem tệp có phải là một thư mục hay không. Nếu đúng như vậy, thì chúng ta chuyển sang tệp tiếp theo, tức là lần lặp tiếp theo. Nếu nó không phải là một thư mục, chúng tôi in số dòng trong tệp bằng cách sử dụng wc , như được hiển thị trước đó.

Sử dụng vòng lặp: Tập lệnh và Dòng lệnh

Cú pháp vòng lặp có thể được sử dụng trực tiếp trong Bash shell hoặc từ một tệp script shell. Một lần cú pháp lặp được nhập trên shell, shell tiếp tục lời nhắc để người dùng tiếp tục các lệnh được lặp.

Hoặc nếu không, người dùng có thể lưu nó trong một tệp script và thực thi tệp script.

Các #! / bin / bash lúc bắt đầu chỉ định trình thông dịch sẽ được sử dụng khi tệp được thực thi. Mặc dù Bash là shell được sử dụng phổ biến nhất hiện nay, nhưng một số người dùng lại thích các shell như zsh, nên được chỉ định thay cho bash ở đầu tệp này.

Để cung cấp quyền thực thi cho tệp này, hãy chạy:

chmod + x test.sh

Cuối cùng, để thực thi tệp, chạy:

./test.sh

Sự kết luận

Các loop in Bash là một tính năng khá đơn giản nhưng nó được sử dụng trong hầu hết các loại kịch bản phức tạp. Việc học nó sẽ đi một chặng đường dài cho dù bạn là người dùng Linux thông thường hay nâng cao, hay bắt đầu học tự động hóa cho các nhiệm vụ Quản trị hệ thống và DevOps.