Câu 1for f in *.txt; do ... done lặp qua cái gì?
Vòng lặp — for xử lý từng tệp một
Bài viết này là một phần của Khóa học Linux, giúp bạn thành thạo từ đầu những kỹ năng Linux thực tiễn, từ các lệnh cơ bản đến lập trình shell script.
Lặp qua danh sách tệp bằng for f in *.txt, lặp có điều kiện bằng while [ "$i" -le 3 ] và until, bỏ qua giá trị rỗng bằng continue, và dừng tại giới hạn bằng break — minh họa và thực hành trên terminal trong trình duyệt.
Xử lý lần lượt một danh sách — for
for lấy từng giá trị bạn đưa vào và chạy cùng một công việc trên mỗi cái.
Dạng của nó là for v in a b c; do ... done, trong đó v lần lượt nhận a, rồi b, rồi c.
Phần nằm giữa do và done là phần thân được lặp lại.
Bạn có thể liệt kê trực tiếp các giá trị, dùng một mẫu tệp như *.txt, hoặc đưa vào đầu ra của $(...) từ một lệnh.
Viết for f in *.txt thì mỗi tệp .txt trong thư mục hiện tại lần lượt đi vào f, nên bạn có thể viết xử lý cho từng tệp.
Dùng $(...) như trong for line in $(cat list.txt) cho phép bạn lặp qua đầu ra của một lệnh.
Đây là cách bạn viết việc tổng hợp một danh sách tệp hoặc xử lý hàng loạt trên nhiều tệp.
for env in dev stg prod; do # xử lý lần lượt các giá trị đã liệt kê
echo "deploying to $env"
done
for f in *.sh; do # xử lý lần lượt các tệp .sh
echo "script: $f"
done
for lần lượt lấy từng phần tử trong danh sách vào f và chạy phần thân, rồi kết thúc tại done khi các phần tử đã hết.| Syntax | Ý nghĩa | Example |
|---|---|---|
for v in a b c; do … done | xử lý lần lượt các giá trị đã liệt kê | for v in dev stg prod; do echo $v; done |
for f in *.txt; do … | xử lý lần lượt các tệp khớp | for f in *.txt; do wc -l "$f"; done |
for x in $(cmd); do … | xử lý lần lượt đầu ra của lệnh | for d in $(ls); do echo $d; done |
do … done | bắt đầu và kết thúc phần thân vòng lặp | for v in a b; do echo $v; done |
Lặp theo điều kiện — while / until
while lặp lại chừng nào điều kiện còn đúng.
Như trong while [ "$i" -lt 3 ]; do ... done, bạn tăng một biến đếm bên trong phần thân để tiến dần đến lúc kết thúc.
until thì ngược lại — nó lặp cho đến khi điều kiện trở thành đúng.
Nó phù hợp với việc mà số vòng không được biết trước.
i=1
while [ "$i" -le 3 ]; do # lặp chừng nào i nhỏ hơn hoặc bằng 3
echo "try $i"
i=$((i + 1))
done # try 1 / try 2 / try 3
i=1
until [ "$i" -gt 3 ]; do # lặp cho đến khi điều kiện trở thành đúng
echo "i=$i"
i=$((i + 1))
done # i=1 / i=2 / i=3
while lặp phần thân chừng nào điều kiện còn đúng; until lặp cho đến khi điều kiện trở thành đúng. Cả hai đều tăng biến đếm trong phần thân để tiến dần đến lúc kết thúc.| Syntax | Ý nghĩa | Example |
|---|---|---|
while [ cond ]; do … done | lặp chừng nào điều kiện còn đúng | while [ "$i" -lt 3 ]; do …; done |
until [ cond ]; do … done | lặp cho đến khi điều kiện trở thành đúng | until [ -f done.flag ]; do …; done |
Điều khiển vòng lặp for — break / continue
Ngay cả khi đang giữa chừng một vòng lặp for, bạn vẫn có thể đổi luồng bằng break và continue.
continue bỏ qua phần còn lại của vòng đó và chuyển sang phần tử kế tiếp, còn break kết thúc chính vòng lặp.
Kết hợp chúng với một điều kiện như if [ điều kiện ]; then continue; fi hoặc if [ điều kiện ]; then break; fi để bỏ qua phần tử bạn không cần hoặc dừng lại khi đã đủ.
for n in 1 2 3 4 5; do
if [ "$n" -eq 3 ]; then continue; fi # bỏ qua 3
if [ "$n" -eq 5 ]; then break; fi # thoát ra tại 5
echo "n=$n"
done # n=1 / n=2 / n=4
for chạy phần thân lần lượt từ n=1. Tại n=3, continue bỏ qua phần còn lại và chuyển sang phần tử kế, và tại n=5, break kết thúc chính vòng lặp (đầu ra là n=1 / n=2 / n=4).| Syntax | Ý nghĩa | Example |
|---|---|---|
continue | bỏ qua vòng này và sang vòng kế | if [ -z "$x" ]; then continue; fi |
break | thoát khỏi vòng lặp giữa chừng | if [ "$n" -gt 100 ]; then break; fi |
Điều khiển vòng lặp while — break / continue
Ngoài việc kiểm tra điều kiện trong while, dùng break và continue cho phép bạn dừng sớm hoặc bỏ qua một vòng.
continue bỏ qua vòng đó và quay lại kiểm tra điều kiện, còn break thoát khỏi vòng lặp mà không chờ điều kiện.
Lưu ý ở đây: nếu bạn không đặt việc cập nhật biến đếm ở đầu phần thân (trước continue), thì vòng bị bỏ qua sẽ không cập nhật nó và vòng lặp không bao giờ kết thúc.
i=0
while [ "$i" -lt 10 ]; do
i=$((i + 1)) # tăng ở đầu
if [ "$i" -eq 3 ]; then continue; fi # bỏ qua vòng thứ 3
if [ "$i" -eq 6 ]; then break; fi # thoát ra ở vòng thứ 6
echo "attempt $i"
done # attempt 1 / 2 / 4 / 5
while chạy phần thân chừng nào điều kiện còn đúng, tăng i thêm 1 mỗi lần. Tại i=3, continue quay lại kiểm tra điều kiện, và tại i=6, break kết thúc vòng lặp mà không chờ điều kiện (đầu ra là attempt 1 / 2 / 4 / 5).| Syntax | Ý nghĩa | Example |
|---|---|---|
continue | bỏ qua vòng này, quay lại kiểm tra | if [ $((i % 3)) -eq 0 ]; then continue; fi |
break | thoát vòng lặp mà không chờ điều kiện | if [ "$found" -ge 4 ]; then break; fi |
| vị trí cập nhật biến đếm | cập nhật nó trước continue | đặt i=$((i + 1)) ở đầu phần thân |
Kiểm tra kiến thức
Hãy trả lời từng câu hỏi một.
Câu 2Từ khóa nào lặp chừng nào điều kiện còn đúng?
Câu 3Cái nào chỉ bỏ qua vòng đó và chuyển sang vòng kế tiếp?