Vòng lặp là một trong những khái niệm cơ bản của ngôn ngữ lập trình. Vòng lặp rất hữu ích khi bạn muốn chạy một loạt lệnh nhiều lần cho đến khi một điều kiện cụ thể được đáp ứng.
Trong các ngôn ngữ kịch bản như Bash, các vòng lặp rất hữu ích để tự động hóa các tác vụ lặp đi lặp lại. Có ba cấu trúc vòng lặp cơ bản trong Bash scripting, for
, while
và until
.
Hướng dẫn này bao gồm các khái niệm cơ bản về vòng lặp while
trong Bash. Chúng ta sẽ tìm hiểu cách sử dụng câu lệnh break
và continue
để thay đổi luồng của một vòng lặp.
Câu lệnh while
Vòng lặp while
được sử dụng để thực hiện một tập hợp các lệnh lặp lại nhiều lần miễn là điều kiện lặp vẫn thỏa mãn.
Vòng lặp while
Bash có dạng sau:
while [CONDITION] do [COMMANDS] done
Câu lệnh while
bắt đầu bằng từ khóa while
, theo sau là biểu thức điều kiện.
Điều kiện được đánh giá trước khi thực hiện các lệnh. Nếu điều kiện đánh giá là true, các lệnh sẽ được thực hiện. Ngược lại, nếu điều kiện được đánh giá là false, vòng lặp sẽ kết thúc và điều khiển chương trình sẽ được chuyển cho lệnh sau đó.
Trong ví dụ dưới đây, trên mỗi lần lặp, giá trị hiện tại của biến i
được in và tăng lên một.
i=0 while [ $i -le 2 ] do echo Number: $i ((i++)) done
Vòng lặp while lặp lại miễn i
là nhỏ hơn hoặc bằng hai. Nó sẽ tạo ra kết quả sau:
Number: 0 Number: 1 Number: 2
Vòng lặp vô hạn
Vòng lặp vô hạn là vòng lặp lặp đi lặp lại vô thời hạn và không bao giờ kết thúc. Nếu điều kiện luôn đánh giá là true, bạn sẽ nhận được một vòng lặp vô hạn.
Trong ví dụ sau, chúng ta đang sử dụng lệnh tích hợp :
để tạo một vòng lặp vô hạn. :
luôn trả về true. Bạn cũng có thể sử dụng câu lệnh true
cài sẵn hoặc bất kỳ câu lệnh nào khác luôn trả về true.
while : do echo "Press <CTRL+C> to exit." sleep 1 done
Vòng lặp while
trên sẽ chạy vô thời hạn. Bạn có thể kết thúc vòng lặp bằng cách nhấn CTRL+C
.
Đây là một dòng tương đương:
while :; do echo 'Press <CTRL+C> to exit.'; sleep 1; done
Đọc một dòng tệp theo dòng
Một trong những cách sử dụng phổ biến nhất của while
là đọc một tệp, luồng dữ liệu hoặc biến từng dòng.
Đây là một ví dụ đọc từng /etc/passwd
dòng tệp và in từng dòng:
file=/etc/passwd while read -r line; do echo $line done < "$file"
Thay vì điều khiển vòng lặp while
với một điều kiện, chúng ta đang sử dụng đầu vào redirection ( < "$file"
) để chuyển một tệp đến lệnh read
, lệnh điều khiển vòng lặp. Các vòng lặp while
sẽ chạy cho đến dòng cuối cùng được đọc.
Khi đọc tệp từng dòng, hãy luôn sử dụng read
với -r
để ngăn dấu gạch chéo ngược hoạt động như một ký tự thoát.
Theo mặc định, read
cắt các ký tự khoảng trắng đầu / cuối (dấu cách và tab). Sử dụng tùy chọn IFS=
trước read
để ngăn chặn hành vi này:
file=/etc/passwd while IFS= read -r line; do echo $line done < "$file"
Break và continue
Các câu lệnh break và continue có thể được sử dụng để kiểm soát việc thực thi vòng lặp while.
Break
Câu lệnh break
kết thúc vòng lặp hiện tại và chuyển quyền điều khiển chương trình cho lệnh theo sau vòng lặp kết thúc. Nó thường được sử dụng để kết thúc vòng lặp khi một điều kiện nhất định được đáp ứng.
Trong ví dụ sau, việc thực hiện vòng lặp sẽ bị gián đoạn khi mục được lặp hiện tại bằng 2
.
i=0 while [ $i -lt 5 ] do echo "Number: $i" ((i++)) if [[ "$i" == '2' ]]; then break fi done echo 'All Done!'
Output:
Number: 0 Number: 1 All Done!
Continue
Câu lệnh continue
thoát khỏi vòng lặp hiện tại của một vòng lặp và chuyển quyền điều khiển chương trình cho lần lặp tiếp theo của vòng lặp.
Trong những điều sau đây, một khi mục lặp hiện nay là tương đương với 2
và continue
sẽ gây ra thực hiện để trở về đầu vòng lặp và tiếp tục với phiên bản kế tiếp.
i=0 while [ $i -lt 5 ] do ((i++)) if [[ "$i" == '2' ]]; then continue fi echo "Number: $i" done echo 'All Done!'
Output:
Number: 1 Number: 3 Number: 4 Number: 5 All Done!
Phần kết luận
Vòng lặp while
liên tục thực hiện một tập hợp các lệnh miễn là một điều kiện là đúng.
Nếu bạn có bất kỳ câu hỏi hoặc phản hồi nào, vui lòng để lại bình luận.