1. Truy xuất giá trị biến
Trong shell script, ký hiệu $ được dùng để lấy giá trị của một biến. Khi đặt $ phía trước tên biến, hệ thống sẽ thay thế bằng giá trị tương ứng.
ten_bien="Xin chao"
echo $ten_bien # Kết quả: Xin chao
Khi cần nối biến với các ký tự khác mà không gây nhầm lẫn, nên sử dụng cặp ngoặc nhọn {} để xác định ranh giới rõ ràng:
echo ${ten_bien}_demo # Kết quả: Xin chao_demo
Nếu viết $ten_bien_demo, shell sẽ hiểu đây là một biến khác (không tồn tại), dẫn đến kết quả rỗng.
2. Thay thế lệnh (Command Substitution)
Bạn có thể thực thi một lệnh và gán kết quả đầu ra vào biến bằng cú pháp $(...) hoặc dấu ngược `...`.
thu_muc_hien_tai=$(pwd)
echo "Bạn đang ở: $thu_muc_hien_tai"
Cú pháp $(...) được khuyến nghị vì dễ đọc, hỗ trợ lồng ghép và tránh nhầm lẫn với dấu nháy đơn. Ví dụ:
ngay_gio=$(date +%Y-%m-%d)
echo $ngay_gio
3. Tham số vị trí (Positional Parameters)
Khi chạy một script với đối số, bạn có thể truy cập chúng qua các ký hiệu đặc biệt bắt đầu bằng $:
$0: Tên file script.$1,$2, ...: Các tham số truyền vào theo thứ tự.$#: Tổng số tham số đã nhận.$@: Tất cả tham số, mỗi tham số giữ nguyên như một đơn vị riêng biệt.$*: Tất cả tham số gộp thành một chuỗi duy nhất.
Ví dụ:
#!/bin/bash
echo "Tên script: $0"
echo "Số lượng tham số: $#"
echo "Tham số thứ nhất: $1"
echo "Tất cả tham số (dùng \$@): $@"
Chạy lệnh: ./script.sh a b c → Kết quả:
Tham số thứ nhất: a Số lượng tham số: 3 Tất cả tham số (dùng $@): a b c
4. Biến đặc biệt
$$: ID tiến trình (PID) của script hiện tại.$!: PID của tiến trình nền vừa được khởi chạy gần nhất.$?: Mã trạng thái của lệnh cuối cùng. Giá trị0nghĩa là thành công, khác0là có lỗi.
Ví dụ kiểm tra lỗi:
ls /thu_muc_khong_ton_tai
echo "Mã lỗi: $?" # Xuất ra mã khác 0
Khởi động tiến trình nền:
sleep 20 &
echo "PID nền: $!"
5. Phân biệt $* và $@
Cả hai đều đại diện cho tất cả tham số, nhưng hành vi khác nhau khi đặt trong dấu ngoặc kép:
"$*": Gộp tất cả tham số thành một chuỗi duy nhất, ngăn cách bởi khoảng trắng."$@": Giữ nguyên từng tham số như các phần tử riêng biệt — hữu ích khi xử lý tham số chứa khoảng trắng.
Ví dụ:
for i in "$*"; do echo "Dung \$*: [$i]"; done
for i in "$@"; do echo "Dung \$@: [$i]"; done
Nếu gọi với "x y" "z t", thì "$*" coi như một chuỗi x y z t, còn "$@" xử lý thành hai phần: x y và z t.
6. Cú pháp nâng cao với ${ }
Ngoài việc truy xuất giá trị, ${ } hỗ trợ nhiều thao tác tiện lợi:
- Giá trị mặc định:
${ten:-mac_dinh}– nếutenchưa được gán, dùngmac_dinh. - Thay thế nội dung:
${bien/cu/moi}– thay lần xuất hiện đầu tiên củacubằngmoi. - Độ dài chuỗi:
${#bien}– trả về số ký tự trong biến.
Ví dụ cụ thể:
du_lieu="Shell scripting"
echo ${du_lieu/script/program} # Kết quả: Shell programming
echo ${#du_lieu} # Kết quả: 15
unset bien_rieng
echo ${bien_rieng:-"gia tri mac dinh"} # Xuất: gia tri mac dinh
7. Xử lý chuỗi với mẫu (Pattern)
Shell cho phép loại bỏ tiền tố hoặc hậu tố dựa trên mẫu ký tự:
${var#mẫu}: Xóa tiền tố ngắn nhất khớp với mẫu.${var##mẫu}: Xóa tiền tố dài nhất khớp với mẫu.${var%mẫu}: Xóa hậu tố ngắn nhất khớp với mẫu.${var%%mẫu}: Xóa hậu tố dài nhất khớp với mẫu.
Ví dụ:
duong_dan="/home/user/file.txt"
echo ${duong_dan#/*/} # Kết quả: home/user/file.txt
echo ${duong_dan##*/} # Kết quả: file.txt
echo ${duong_dan%/*} # Kết quả: /home/user
echo ${duong_dan%%.*} # Kết quả: /home/user/file
8. Tính toán số học
Thực hiện phép tính nguyên bằng cú pháp $((...)). Chỉ hỗ trợ số nguyên.
a=7
b=3
tong=$((a + b))
hieu=$((a - b))
binh_phuong=$((a * a))
echo "Tổng: $tong, Hiệu: $hieu, Bình phương: $binh_phuong"
Với phép tính số thực, cần dùng công cụ ngoài như bc:
so_thuc=$(echo "scale=2; 5 / 3" | bc)
echo $so_thuc # Kết quả: 1.66