Macld Linux,System Bài 2. Điều Kiện trong Bash: Xử Lý Logic Cơ Bản

Bài 2. Điều Kiện trong Bash: Xử Lý Logic Cơ Bản

Đ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:

  1. 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
  2. So sánh string:
    • =: Bằng.
    • !=: Không bằng.
      NAME="System"
      if [ "$NAME" = "System" ]; then
      echo "Hello world!"
      fi
  3. 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ì $CPU là 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 Bashtest 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.

Điều hướng chuỗi bài viết

<< Bài 1. Cơ Bản Bash Script trong DevOps
>> Bài 3. Vòng Lặp trong Bash DevOps: Tự Động Hóa Lặp Lại Hiệu Quả

Leave a Reply

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *