Cú điện thoại lúc 2 giờ sáng và bài học đắt giá
2 giờ sáng, điện thoại rung bần bật trên bàn. Bạn lờ đờ mở máy, đập vào mắt là hàng nghìn dòng log lỗi: Server production đã cạn kiệt tài nguyên. Nguyên nhân không phải do bị tấn công, mà đến từ một script Bash chạy cronjob định kỳ. Chỉ vì thiếu một cặp dấu ngoặc kép tại biến đường dẫn có chứa khoảng trắng, lệnh rm -rf thay vì dọn dẹp thư mục tạm đã quét sạch các dữ liệu quan trọng xung quanh.
Kịch bản này không hề hiếm. Sau hơn 5 năm quản trị hệ thống, mình nhận ra rằng dù bạn có cẩn thận đến đâu, những lỗi “typo” logic vẫn luôn chực chờ. Để không phải thức trắng đêm fix bug, mình luôn dùng một trợ thủ đắc lực: ShellCheck.
ShellCheck không đơn thuần là công cụ kiểm tra cú pháp. Nó giống như một người đồng nghiệp kỳ cựu luôn soi xét từng dòng code, giúp bạn nhận ra các lỗ hổng bảo mật hoặc những câu lệnh đã lỗi thời trước khi chúng kịp gây họa.
Quick Start: Cài đặt ShellCheck nhanh trong 60 giây
Việc trang bị “tấm khiên” này cực kỳ đơn giản. Tùy vào hệ điều hành bạn đang dùng, hãy chạy lệnh tương ứng:
1. Cài đặt trên Linux
Ubuntu/Debian:
sudo apt update && sudo apt install shellcheck
CentOS/RHEL (thông qua EPEL):
sudo yum install epel-release -y
sudo yum install shellcheck -y
MacOS (dùng Homebrew):
brew install shellcheck
2. Kiểm tra script đầu tiên
Giả sử bạn có script clean_logs.sh gặp lỗi phổ biến này:
#!/bin/bash
log_dir=/var/log/my app
rm -rf $log_dir/*
Chạy lệnh: shellcheck clean_logs.sh. Ngay lập tức, bạn sẽ nhận được cảnh báo đỏ. Trong Bash, nếu không có ngoặc kép, lệnh trên sẽ biến thành rm -rf /var/log/my app/*. Shell sẽ hiểu đây là hai đối số riêng biệt: thư mục /var/log/my và tất cả file trong thư mục app/. Thảm họa bắt đầu từ đó.
3 lỗi “chí mạng” mà ai cũng từng mắc phải
ShellCheck giúp bạn bắt bài những lỗi logic mà mắt thường rất khó nhận ra trong các file script dài hàng trăm dòng.
1. Quên đóng gói biến (Quoting)
Đây là “vua” của các loại lỗi. Luôn dùng ngoặc kép cho biến để bảo vệ script trước các khoảng trắng hoặc ký tự lạ.
# Rủi ro cao
file_path=$1
# Chuẩn chuyên gia
file_path="$1"
2. Biến “ma” (Unassigned variables)
Bạn gõ nhầm tên biến? Bash mặc định sẽ coi đó là một chuỗi rỗng thay vì báo lỗi. ShellCheck sẽ cảnh báo ngay: var is referenced but not assigned.
target_dir="/tmp/data"
rm -rf "$targte_dir/" # Gõ sai tên biến, suýt nữa là xóa sạch root /
3. Lạm dụng Backticks (“)
Sử dụng `command` là phong cách từ thập niên 90. Nó cực khó lồng ghép và xử lý ký tự đặc biệt. ShellCheck sẽ hướng bạn sang $(command) – hiện đại hơn, sạch sẽ hơn.
Đưa ShellCheck vào workflow để làm việc nhàn hơn
Đừng đợi đến khi viết xong mới đi check. Hãy biến nó thành tự động.
Tích hợp trực tiếp vào VS Code
Hãy tìm và cài extension “shellcheck”. Mỗi khi bạn gõ sai, một đường gạch chân màu đỏ sẽ xuất hiện kèm hướng dẫn sửa lỗi chi tiết. Nó giống như có chuyên gia Linux “nhắc bài” ngay bên cạnh.
Tự động hóa với CI/CD
Trong các dự án lớn, hãy thêm ShellCheck vào pipeline của GitHub Actions hoặc GitLab CI. Script chỉ được phép merge khi đã vượt qua bài kiểm tra của ShellCheck. Điều này đảm bảo 100% code Bash trong repo đều đạt chuẩn.
# GitHub Action mẫu
steps:
- uses: actions/checkout@v3
- name: Run ShellCheck
run: shellcheck scripts/*.sh
Lời khuyên từ thực tế: Đừng chỉ dừng lại ở ShellCheck
Để script thực sự bền bỉ trên production, mình luôn áp dụng bộ ba set -euo pipefail ở ngay dòng thứ 2 của mọi script. Câu lệnh này giúp script dừng ngay khi có lỗi xảy ra, thay vì tiếp tục chạy và gây thêm hỏng hóc.
Ngoài ra, hãy chú ý đến định dạng file (Line Endings). Nếu bạn soạn thảo trên Windows (CRLF) rồi đưa lên Linux (LF), script sẽ báo lỗi kỳ lạ. ShellCheck cũng rất nhạy với vấn đề này và sẽ nhắc bạn chuyển đổi định dạng ngay lập tức.
Viết Bash không khó, cái khó là viết sao cho an toàn. Hãy cài đặt ShellCheck ngay hôm nay. Đừng để đến lúc server sập mới hối hận vì một dấu cách vô tình!

