Một Bash script tối thiểu:
1 |
|
Chạy:
1 | chmod u+x script.sh |
Hoặc không cần executable bit:
1 | bash script.sh |
Shebang
1 |
env tìm Bash theo PATH, phù hợp khi macOS và Linux đặt Bash khác chỗ. Đổi lại, script phụ thuộc PATH. Với môi trường bị kiểm soát chặt, dùng absolute path có thể dễ đoán hơn.
Strict mode, nhưng hiểu nó
1 | set -Eeuo pipefail |
-e: dừng khi command fail trong phần lớn context.-u: lỗi khi dùng biến chưa set.pipefail: pipeline fail nếu một command bên trong fail.-E: ERR trap được inherit tốt hơn.
Strict mode giảm silent failure, không biến shell thành ngôn ngữ có exception model hoàn hảo.
Quote biến
1 | rm -- "$file" |
Không quote biến khiến word splitting và glob expansion can thiệp. Tên file có khoảng trắng là bài test cơ bản; tên file bắt đầu bằng - là bài test xem ta có nhớ -- hay không.
Dùng array thay vì command string
1 | command=(rsync -av --delete "$source/" "$destination/") |
Tránh eval. Nếu dữ liệu bên ngoài chui vào command string, eval có thể biến một filename thành chương trình phụ.
Portability
Bash mặc định trên macOS có thể cũ hơn Bash cài qua Homebrew. Nếu dùng associative array hoặc feature mới, khai báo version requirement và kiểm tra:
1 | (( BASH_VERSINFO[0] >= 4 )) || { |
Dùng ShellCheck trong editor/CI. Nó không viết script thay ta, nhưng bắt được nhiều lỗi trước khi production được quyền tham gia review.