Điều Kiện trong Bash – Xử Lý Logic Cơ Bản
Sau khi nắm được cách viết script cơ bản và dùng biến trong Bash (bài 1), giờ là lúc làm cho script của bạn “thông minh” hơn. Điều kiện – như if else Bash – là cách để Bash quyết định làm gì dựa trên tình huống. Trong bài thứ hai của series Bash Script Chuyên Sâu cho DevOps, tôi sẽ dẫn bạn qua cách dùng điều kiện trong Bash DevOps, từ test command Bash, cách xây dựng logic Bash, đến thực hành script thực tế. Đây là những gì tôi dùng hàng ngày để tự động hóa trong DevOps, không phải chỉ để khoe lý thuyết đâu nhé!
Điều Kiện trong Bash Là Gì?
Logic Cơ Bản với Bash
Điều kiện cho phép script kiểm tra trạng thái và phản hồi phù hợp:
- Disk đầy → gửi cảnh báo.
- Service chạy → bỏ qua, không chạy → khởi động.
Ví dụ: Thay vì chỉ in % disk usage (bài 1), script có thể cảnh báo nếu vượt 80%.
Tại Sao Quan Trọng trong DevOps?
- Tự động hóa thông minh: Quyết định dựa trên dữ liệu (VD: chỉ deploy nếu test pass).
- Giám sát: Kiểm tra hệ thống và hành động ngay (VD: restart server khi CPU cao).
- Tiết kiệm thời gian: Loại bỏ kiểm tra thủ công.
Thực tế: Tôi viết script kiểm tra disk, gửi email, telegram khi đầy – nhờ điều kiện, nó cứu server khỏi crash lúc 1 giờ sáng.
Cách Dùng Điều Kiện trong Bash
Câu Lệnh If/Else
Cú pháp cơ bản:
if [ điều_kiện ]; then
# Làm gì nếu đúng
else
# Làm gì nếu sai
fi
[ ]: Test command, kiểm tra điều kiện.then: Thực thi nếu điều kiện đúng.fi: Kết thúc khối if.
Ví dụ:
DISK=$(df -h / | tail -1 | awk '{print $5}' | cut -d'%' -f1)
if [ $DISK -gt 80 ]; then
echo "Warning!: Disk usage over 80% ($DISK%)"
else
echo "Disk OK: $DISK%"
fi
Test Command Bash
[ ] hỗ trợ nhiều loại kiểm tra:
- So sánh số:
-gt: Greater than (lớn hơn).-lt: Less than (nhỏ hơn).-eq: Equal (bằng).if [ 5 -gt 3 ]; then echo "5 lớn hơn 3" fi
- So sánh string:
=: Bằng.!=: Không bằng.NAME="System" if [ "$NAME" = "System" ]; then echo "Hello world!" fi
- Kiểm tra file:
-e: File tồn tại.-f: Là file thường.-d: Là thư mục.if [ -d "/tmp" ]; then echo "Folder /tmp existed!" fi
Tips: Luôn để biến trong " " (VD: "$NAME") để tránh lỗi khi biến rỗng.
Nhiều Điều Kiện
- AND (
&&):if [ $DISK -gt 80 ] && [ $CPU -gt 90 ]; then echo "Both disk and CPU are high!" fi - OR (
||):if [ $DISK -gt 80 ] || [ $CPU -gt 90 ]; then echo "Disk or CPU are high!" fi
Thực Hành: Script Kiểm Tra Hệ Thống
Tạo smart_check.sh:
#!/bin/bash
# Variable
HOST=$(hostname)
DISK=$(df -h / | tail -1 | awk '{print $5}' | cut -d'%' -f1)
CPU=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}')
# Check disk
if [ $DISK -gt 80 ]; then
echo "Warning: Disk usage on $HOST exceeded $DISK% (threshold: 80%)"
else
echo "Disk on $HOST OK: $DISK%"
fi
# Check CPU
if [ $(echo "$CPU > 90" | bc) -eq 1 ]; then
echo "Warning!: CPU usage on $HOST exceeded $CPU% (threshold: 90%)"
else
echo "CPU on $HOST OK: $CPU%"
fi
# Check file log existed
LOG_FILE="/var/log/syslog"
if [ -f "$LOG_FILE" ]; then
echo "File log $LOG_FILE existed"
else
echo "Not found $LOG_FILE"
fi
Chạy và Test
chmod +x smart_check.sh
./smart_check.sh
- Kết quả mẫu:
root@ip-172-31-15-92:~# ./smart_check.sh Disk on ip-172-31-15-92 OK: 12% CPU on ip-172-31-15-92 OK: 0.0% File log /var/log/syslog existed
Giải thích:
$DISK -gt 80: So sánh disk với 80%.$(echo "$CPU > 90" | bc): So sánh số thực (vì$CPUlà float).-f "$LOG_FILE": Kiểm tra file log.
System/DevOps: Script này có thể dùng để giám sát server, thêm cron job để chạy định kỳ.
Debug Điều Kiện
- Thêm
-xđể debug:bash -x smart_check.sh - Nếu lỗi so sánh: Đảm bảo biến không rỗng (dùng
"$DISK"thay vì$DISK).
Thực tế: Tôi từng quên " " quanh biến, script báo lỗi – từ đó luôn cẩn thận hơn.
Ứng Dụng trong System/DevOps
Tự Động Hóa Quyết Định
- Kiểm tra trước deploy:
DISK=$(df -h / | tail -1 | awk '{print $5}' | cut -d'%' -f1) if [ $DISK -lt 90 ]; then echo "Sufficient disk space, proceeding with deployment..." else echo "Disk almost full, postponing deployment!" exit 1 fi
Pipeline CI/CD
- Trong
.gitlab-ci.yml:check_system: script: - bash smart_check.sh - if [ $(df -h / | tail -1 | awk '{print $5}' | cut -d'%' -f1) -gt 90 ]; then exit 1; fi
Case study: Một team dùng script kiểm tra CPU trước khi chạy test nặng, tránh làm crash runner CI.
Kết Luận
Điều kiện trong Bash giúp script của chúng ta thông minh hơn với if else Bash, test command Bash, và logic Bash. Thực hành với smart_check.sh cho thấy bạn có thể kiểm tra và phản hồi dựa trên trạng thái hệ thống – bước đầu cho tự động hóa thực tế. Bài tiếp theo, chúng ta sẽ khám phá Vòng Lặp trong Bash – cách xử lý công việc lặp lại như pro.
