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 đi chạy lại một loạt lệnh cho đến khi đạt được một điều kiện nhất định.

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 .

Trong hướng dẫn này, chúng tôi sẽ trình bày những điều cơ bản về vòng lặp for 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.

Vòng lặp for Bash tiêu chuẩn

Các vòng lặp for trên một danh sách các mục và thực hiện các thiết lập cho các lệnh.

Vòng lặp for có dạng sau:

for item in [LIST]
do
  [COMMANDS]
done

Danh sách có thể là một chuỗi các chuỗi được phân tách bằng dấu cách, một dải số, đầu ra của một lệnh, một mảng, v.v.

Lặp qua các chuỗi

Trong ví dụ bên dưới, vòng lặp sẽ lặp lại từng mục trong danh sách chuỗi và biến element sẽ được đặt thành mục hiện tại:

for element in Hydrogen Helium Lithium Beryllium
do
  echo "Element: $element"
done

Vòng lặp sẽ tạo ra kết quả sau:

Element: Hydrogen
Element: Helium
Element: Lithium
Element: Beryllium

Lặp qua một dải số

Bạn có thể sử dụng biểu thức trình tự để chỉ định một dải số hoặc ký tự bằng cách xác định điểm bắt đầu và điểm kết thúc của dải ô. Biểu thức dãy có dạng sau:

{START..END}

Đây là một vòng lặp ví dụ lặp lại qua tất cả các số từ 0 đến 3:

for i in {0..3}
do
  echo "Number: $i"
done

Output:

Number: 0
Number: 1
Number: 2
Number: 3

Bắt đầu từ Bash 4, cũng có thể chỉ định số gia khi sử dụng phạm vi. Biểu thức có dạng sau:

{START..END..INCREMENT}

Dưới đây là một ví dụ cho thấy cách tăng thêm 5:

for i in {0..20..5}
do
  echo "Number: $i"
done

Output:

Number: 0
Number: 5
Number: 10
Number: 15
Number: 20

Lặp lại các phần tử mảng

Bạn cũng có thể sử dụng for để lặp qua một mảng các phần tử.

Trong ví dụ dưới đây, chúng ta đang định nghĩa một mảng được đặt tên BOOKS và lặp qua từng phần tử của mảng.

BOOKS=('In Search of Lost Time' 'Don Quixote' 'Ulysses' 'The Great Gatsby')

for book in "${BOOKS[@]}"; do
  echo "Book: $book"
done

Output:

Book: In Search of Lost Time
Book: Don Quixote
Book: Ulysses
Book: The Great Gatsby

Vòng lặp cho Bash kiểu C

Cú pháp của for C-style có dạng sau:

for ((INITIALIZATION; TEST; STEP))
do
  [COMMANDS]
done

Phần INITIALIZATION được thực hiện một lần khi vòng lặp bắt đầu. Sau đó, TEST được đánh giá. Nếu nó là false, vòng lặp bị kết thúc. Nếu TEST đúng, các lệnh bên trong phần thân của for được thực thi và STEP phần này được cập nhật.

Trong đoạn mã ví dụ sau, vòng lặp có dấu sao bằng cách khởi tạo i = 0 và trước mỗi lần lặp sẽ kiểm tra nếu i ≤ 10. Nếu đúng, nó sẽ in ra giá trị hiện tại của i và [tăng biến] i lên 1 ( i++) nếu không thì vòng lặp kết thúc.

for ((i = 0 ; i <= 1000 ; i++)); do
  echo "Counter: $i"
done

Vòng lặp sẽ lặp lại 1001 lần và tạo ra kết quả sau:

Counter: 0
Counter: 1
Counter: 2
...
Counter: 998
Counter: 999
Counter: 1000

Break và continue

Các câu lệnh breakcontinue có thể được sử dụng để kiểm soát việc thực thi vòng lặp for.

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 đến câu lệnh theo sau câu lệnh đã 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, chúng ta đang sử dụng if để chấm dứt việc thực thi vòng lặp khi mục được lặp hiện tại bằng ‘Lithium’.

for element in Hydrogen Helium Lithium Beryllium; do
  if [[ "$element" == 'Lithium' ]]; then
    break
  fi
  echo "Element: $element"
done

echo 'All Done!'

Output:

Element: Hydrogen
Element: Helium
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 ví dụ sau, chúng ta đang lặp lại một loạt các số. Khi mục được lặp hiện tại bằng ‘2’, continue sẽ khiến việc thực thi quay trở lại phần đầu của vòng lặp và tiếp tục với lần lặp tiếp theo:

for i in {1..5}; do
  if [[ "$i" == '2' ]]; then
    continue
  fi
  echo "Number: $i"
done

Output:

Number: 1
Number: 3
Number: 4
Number: 5

Ví dụ về vòng lặp for Bash

Đổi tên tệp bằng khoảng trắng trong tên tệp

Ví dụ sau cho thấy cách đổi tên tất cả các tệp trong thư mục hiện tại bằng một khoảng trắng trong tên của nó bằng cách thay thế khoảng trắng thành dấu gạch dưới:

for file in *\ *; do
  mv "$file" "${file// /_}"
done

Hãy chia nhỏ từng dòng mã:

  • Dòng đầu tiên tạo một vòng lặp for và lặp qua danh sách tất cả các tệp có khoảng trắng trong tên của nó. Biểu thức *\ *tạo danh sách.
  • Dòng thứ hai áp dụng cho từng mục của danh sách và chuyển tệp sang tệp mới thay thế khoảng trắng bằng dấu gạch dưới ( _). Phần ${file// /_}này đang sử dụng phần mở rộng tham số shell để thay thế một mẫu trong một tham số bằng một chuỗi.
  • done cho biết sự kết thúc của đoạn vòng lặp.

Thay đổi phần mở rộng tệp

Ví dụ sau cho thấy cách sử dụng for Bash để đổi tên tất cả các tệp kết thúc bằng .jpeg trong thư mục hiện tại bằng cách thay thế phần mở rộng tệp từ .jpeg thành .jpg.

for file in *.jpeg; do
    mv -- "$file" "${file%.jpeg}.jpg"
done

Hãy phân tích từng dòng mã:

  • Dòng đầu tiên tạo một vòng lặp for và lặp qua danh sách tất cả các tệp kết thúc bằng ‘.jpeg’.
  • Dòng thứ hai áp dụng cho từng mục trong danh sách và chuyển tệp sang tệp mới thay thế ‘.jpeg’ bằng ‘.jpg’. ${file%.jpeg} để xóa phần ‘.jpeg’ khỏi tên tệp bằng cách sử dụng phần mở rộng tham số shell
  • done cho biết sự kết thúc của đoạn vòng lặp.

Phần kết luận

Vòng lặp for Bash được sử dụng để thực hiện lặp đi lặp lại một bộ lệnh đã cho trong một số lần cố định.

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