Vòng Lặp trong Bash – Tự Động Hóa Lặp Lại
Vòng Lặp trong Bash Là Gì?
Tự Động Hóa Lặp Lại
Vòng lặp cho phép chạy một khối lệnh nhiều lần dựa trên danh sách hoặc điều kiện:
- Kiểm tra disk trên 10 server thay vì gõ lệnh từng cái.
- Xử lý tất cả file log trong thư mục mà không cần viết lại code.
Ví dụ: Thay vì chạy df -h 5 lần cho 5 thư mục, vòng lặp làm điều đó trong 1 script.
Tại Sao Quan Trọng trong System/DevOps?
- Tiết kiệm thời gian: Tự động hóa task lặp (VD: cập nhật nhiều server).
- Scale: Quản lý hệ thống lớn dễ dàng (VD: kiểm tra hàng loạt container).
- Pipeline: Xử lý batch job trong CI/CD.
Thực tế: Tôi từng dùng vòng lặp để kiểm tra CPU trên nhiều server, phát hiện 1 máy bất thường trong 1 phút – thủ công thì mất cả buổi.
Các Loại Vòng Lặp trong Bash
For Loop Bash
Dùng để lặp qua danh sách hoặc phạm vi.
- Lặp qua danh sách:
for ITEM in "apple" "banana" "orange" do echo "Fruit: $ITEM" done- Kết quả:
Fruit: apple Fruit: banana Fruit: orange
- Kết quả:
- Lặp qua phạm vi số:
for i in {1..3} do echo "Số: $i" done - Lặp qua output lệnh:
for FILE in $(ls *.txt) do echo "File: $FILE" done
Tips: {1..3} là cú pháp Bash 4+, nếu dùng Bash cũ, thay bằng seq 1 3.
While Loop Bash
Lặp khi điều kiện đúng.
COUNT=1
while [ $COUNT -le 5 ]
do
echo "Đếm: $COUNT"
COUNT=$((COUNT + 1))
done
- Kết quả: In từ 1 đến 5.
Tips: Dùng $(( )) để tính toán số học.
Until Loop
Lặp cho đến khi điều kiện đúng (ngược với while).
COUNT=1
until [ $COUNT -gt 5 ]
do
echo "Đếm: $COUNT"
COUNT=$((COUNT + 1))
done
System/DevOps: While kiểm tra trạng thái liên tục (VD: đợi service chạy), for xử lý danh sách cố định (VD: list server).
Thực Hành: Script Kiểm Tra Nhiều Server
Script với For Loop
Tạo check_servers.sh để kiểm tra disk trên nhiều server:
#!/bin/bash
# Danh sách server (thay bằng IP)
SERVERS="server1 server2 server3"
for SERVER in $SERVERS
do
echo "Kiểm tra $SERVER..."
# Giả lập disk usage (thay bằng SSH thực tế sau)
DISK=$((RANDOM % 100)) # Số ngẫu nhiên 0-99
if [ $DISK -gt 80 ]; then
echo "Cảnh báo: Disk trên $SERVER vượt $DISK% (ngưỡng 80%)"
else
echo "Disk trên $SERVER ổn: $DISK%"
fi
done
Script với While Loop
Tạo wait_service.sh để đợi service chạy:
#!/bin/bash
# Giả lập kiểm tra service (thay bằng lệnh thực tế như 'systemctl')
COUNT=0
MAX_WAIT=10
while [ $COUNT -lt $MAX_WAIT ]
do
if [ $((RANDOM % 2)) -eq 1 ]; then # Giả lập service chạy
echo "Service đã chạy sau $COUNT giây!"
exit 0
fi
echo "Đợi service... ($COUNT/$MAX_WAIT)"
COUNT=$((COUNT + 1))
sleep 1
done
echo "Timeout: Service không chạy sau $MAX_WAIT giây"
exit 1
Chạy và Test
- For loop:
chmod +x check_servers.sh ./check_servers.sh- Kết quả mẫu:
Kiểm tra server1... Disk trên server1 ổn: 60% Kiểm tra server2... Cảnh báo: Disk trên server2 vượt 95% (ngưỡng 80%) Kiểm tra server3... Disk trên server3 ổn: 30%
- Kết quả mẫu:
- While loop:
chmod +x wait_service.sh ./wait_service.sh- Kết quả: Chờ ngẫu nhiên, thoát khi “service chạy” hoặc timeout.
DevOps: check_servers.sh có thể mở rộng với SSH (bài 13), wait_service.sh dùng trong pipeline để đợi DB.
Debug Vòng Lặp
- Thêm
-x:bash -x check_servers.sh - Kiểm tra biến trong vòng lặp:
echo "Debug: SERVER=$SERVER, DISK=$DISK"
Thực tế: Tôi từng quên tăng $COUNT trong while, vòng lặp chạy vô tận – -x cứu tôi khỏi debug mò mẫm.
Ứng Dụng trong DevOps
Tự Động Hóa Danh Sách
- Kiểm tra file log:
for LOG in /var/log/*.log do if [ -f "$LOG" ]; then echo "Xử lý $LOG..." fi done
Pipeline CI/CD
- Đợi job hoàn thành:
wait_job: script: - bash wait_service.sh
Case study: Một team dùng for loop để kiểm tra 50 container cùng lúc, phát hiện lỗi trong 2 phút thay vì kiểm thủ công cả giờ.
Kết Luận
Vòng lặp trong Bash là công cụ mạnh mẽ để tự động hóa Bash với for loop Bash và while loop Bash. Thực hành với check_servers.sh và wait_service.sh cho thấy bạn có thể xử lý công việc lặp lại hiệu quả – bước tiến lớn trong tự động hóa. Bài tiếp theo, chúng ta sẽ khám phá Xử Lý File trong Bash – cách đọc, ghi, và quản lý dữ liệu như pro.
