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, forwhile 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.

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments