TL;DR

Bash scripting là kỹ năng nền tảng cho mọi người làm việc với Linux - từ developer đến sysadmin đến DevOps engineer. Infographic của @sysxplore tóm gọn 18 khái niệm cốt lõi trong một script.sh duy nhất: shebang, variables, user input, conditionals, loops, functions, arrays, command substitution, redirections, arithmetic, parameter expansion, signal handling và comments.

Bash Scripting Basics infographic by sysxplore

Bash là gì và tại sao cần học

Bash - viết tắt của Bourne Again SHell - là command-line interpreter và scripting language mặc định trên hầu hết các hệ thống Linux. Lần đầu ra mắt năm 1989 bởi Brian Fox cho GNU Project, Bash 5.2 (2022) hiện là phiên bản được triển khai rộng rãi nhất trên server toàn cầu.

Lý do học Bash: một script vài chục dòng thay thế được hàng giờ thao tác thủ công - từ backup tự động, deploy code, đến xử lý hàng nghìn file chỉ trong vài giây. Bash pre-installed trên Ubuntu, Debian, CentOS và macOS, không cần cài thêm gì.

Bắt đầu đúng cách

Mọi Bash script đều bắt đầu bằng shebang line ở dòng đầu tiên - dòng này báo cho hệ điều hành biết dùng bash interpreter:

#!/bin/bash

Sau đó cấp quyền thực thi và chạy:

chmod +x script.sh
./script.sh

Variables khai báo không có dấu cách quanh =, truy cập bằng $:

username="Jay"
filename=$3        # lấy từ argument thứ 3
echo "$username"

User input đọc bằng read:

read -p "Enter your username: " user
echo "Username: $user"

Điều kiện và vòng lặp

Conditional if phân nhánh logic - ví dụ kiểm tra quyền root qua biến đặc biệt $EUID:

if [ "$EUID" -ne 0 ]; then
  echo "Not running as root."
else
  echo "Running as root."
fi

Với nhiều pattern, case statement gọn hơn if/elif lồng nhau:

case $num in
  1) echo "You chose one." ;;
  2) echo "You chose two." ;;
  *) echo "Invalid choice." ;;
esac

For loop lặp qua range số hoặc danh sách - cú pháp {1..5} tạo range:

for i in {1..5}; do
  echo "$i"
done

File operations kết hợp điều kiện: -e kiểm tra file tồn tại, -d kiểm tra là directory, -f kiểm tra là regular file.

Hàm và mảng

Functions nhóm code để tái sử dụng, nhận tham số qua $1, $2:

function greet() {
  echo "Hello, $1!"
}
greet "Alice"   # output: Hello, Alice!

Indexed arrays lưu danh sách giá trị, truy cập qua index bắt đầu từ 0:

fruits=("Apple" "Orange" "Banana")
echo "${fruits[0]}"    # Apple
echo "${fruits[@]}"    # tất cả phần tử

Associative arrays (dictionary) lưu key-value, phải khai báo declare -A trước:

declare -A capitals
capitals[USA]="Washington D.C."
capitals[France]="Paris"
echo "${capitals[France]}"   # Paris

4 công cụ nâng cao hay dùng nhất

Command substitution ($()) - capture output của lệnh vào biến, thay thế cú pháp backtick cũ:

current_date=$(date)
echo "Today is: $current_date"

Arithmetic operations - tính toán số nguyên bằng $(( )):

result=$(( 15 - 2 ))
echo $result   # 13

Redirections - điều hướng stdin/stdout/stderr:

echo "sample text" > example.txt         # ghi stdout vào file
find / -name hello.txt &> /dev/null      # bỏ qua cả stdout & stderr

Parameter expansion - xử lý string trực tiếp trên biến, ví dụ lấy tên file từ path:

SRC="/path/to/foo.cpp"
BASEPATH=${SRC##*/}    # loại bỏ mọi thứ trước "/" cuối cùng
echo $BASEPATH          # foo.cpp

Xử lý lỗi và tín hiệu

Mọi lệnh Bash trả về exit status code: 0 là thành công, khác 0 là lỗi. Kiểm tra bằng biến đặc biệt $?:

cat nonexistent-file.txt 2> /dev/null
echo "Exit status: $?"   # 1

Signal handling với trap - dọn dẹp tài nguyên khi script bị interrupt bởi SIGTERM hoặc SIGINT:

trap 'echo "Received SIGTERM. Cleaning up..."; exit' SIGTERM

Cho production script, luôn bật strict mode ngay sau shebang:

set -euo pipefail

-e thoát ngay khi có lệnh lỗi, -u báo lỗi khi dùng biến chưa khai báo, -o pipefail bắt lỗi trong pipe chain. Ba flag này kết hợp phát hiện bug sớm trước khi script gây hại dữ liệu.

Bắt đầu ngay hôm nay

Chỉ cần terminal và text editor là đủ. Cách học nhanh nhất: lấy infographic của @sysxplore làm reference, tạo file practice.sh, copy từng đoạn code, chạy thử rồi modify. Một buổi tối đủ để tự viết script backup hoặc deploy đơn giản.

Giới hạn cần biết: Bash không hỗ trợ số thực natively (cần bc hoặc awk), không phù hợp cho logic phức tạp (dùng Python hoặc Go khi cần). Nhưng với automation task hàng ngày trên Linux - Bash vẫn là công cụ nhanh và hiệu quả nhất.

Nguồn: FreeCodeCamp Bash Tutorial, DevHints Bash Cheatsheet, @sysxplore.