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, for
, while
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 break
và continue
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.