Hướng dẫn này giải thích cách truyền tham số dòng lệnh cho bash script. Nhiều ví dụ giúp bạn bắt đầu.
Bash/Shell script tự động hóa workflow Linux, tăng tốc công việc để bạn về sớm ( hoặc trốn trong server room đến 5h).
Làm script tái sử dụng càng hữu ích – không cần viết script làm cùng tác vụ cho info khác nhau hoặc ngày khác – dùng lại script, cung cấp parameters – chỉ thị từ dòng lệnh. Đây còn gọi là dùng arguments dòng lệnh.
Ví dụ, script xuất text ra file. Muốn đổi tên file, phải sửa script. Muốn xuất nhiều file, cần nhiều bản copy script. Dùng parameter, một script xuất ra bao nhiêu file tùy ý, tên tùy ý, truyền từ dòng lệnh.
Có vài cách truyền parameters – options và values – tùy mục đích. Dưới đây vài phương pháp, kèm ví dụ:
Phương pháp getopts / Flags đọc input dòng lệnh
- getopts là lệnh shell lấy options (hoặc flags) từ input dòng lệnh và làm value (hoặc argument) có sẵn cho script
- Option là chữ cái đơn trước - (dash), theo sau value, như -v value
- Dùng tốt khi thứ tự không quan trọng
- Có lẽ tốt nhất trong các phương pháp liệt kê
Ví dụ script Bash getopts
Script ví dụ nhận 3 option cho đơn đặt đồ ăn nhanh:
- -o cho order (món)
- -s cho size (cỡ)
- -d cho drink (đồ uống)
fastFoodOrder.sh
#!/bin/bash # Dùng while loop parse options o, s, d while getopts o:s:d: flag do # Match option (gán cho $flag) với ý nghĩa dùng case block # OPTARG là value nhận từ getopts cho option tương ứng, gán cho biến theo flag case "${flag}" in o) order=${OPTARG};; s) size=${OPTARG};; d) drink=${OPTARG};; esac done # Giá trị truyền cho option giờ có sẵn trong biến tương ứng echo "Order: $order";; echo "Size: $size";; echo "Drink: $drink";; Xem thêm về dòng #!/bin/bash đầu script tại đây.
Chạy:
bash ./fastFoodOrder.sh -d Cola -o 'Fish Burger Meal' -s Large
Kết quả:
Order: Fish Burger Meal Size: Large Drink: Cola
Như output – thứ tự option không quan trọng.
Tại sao dùng ./ khi chạy script?
Truyền nhiều giá trị cho cùng option
Có thể truyền option nhiều lần cho nhiều value – chúng thành array trong script.
Cách tốt nhất truyền nhiều value cho 1 option vì cho phép mọi ký tự trong value – truyền trong quotes hoặc delimiter sẽ giới hạn.
fastFoodOrderExtras.sh
#!/bin/bash # While loop parse options o, s, d, e while getopts o:s:d:e: flag do case "${flag}" in o) order=${OPTARG};; s) size=${OPTARG};; d) drink=${OPTARG};; e) extras+=${OPTARG};;# Tạo hoặc append array variable chứa nhiều extras value esac done echo "Order: $order";; echo "Size: $size";; echo "Drink: $drink";; echo "Danh sach extras la '${extras[@]}'" # Loop qua nhiều extras value for val in "${extras[@]}";; do echo $val done Script chấp nhận nhiều -e cho extras:
bash ./fastFoodOrderExtras.sh -d Cola -o 'Fish Burger Meal' -s Large -e Sauce -e Salt -e Pepper
Output:
Order: Fish Burger Meal Size: Large Drink: Cola The list of extras is 'SauceSaltPepper' SauceSaltPepper
Dùng Positional Parameters trong script
- Dùng khi số lượng argument/parameter biết trước và thứ tự cố định
- Tốt cho script đơn giản
Ví dụ
fastFoodOrder.sh
#!/bin/bash echo "Order: $1";; echo "Size: $2";; echo "Drink: $3";;
Chạy:
bash ./fastFoodOrder.sh 'Fish Burger Meal' Large Cola
Kết quả:
Order: Fish Burger Meal Size: Large Drink: Cola
Lưu ý: nếu option sai thứ tự, giá trị bị lẫn. Position matters!
bash ./fastFoodOrder.sh 'Fish Burger Meal' Cola Large
Kết quả sai:
Order: Fish Burger Meal Size: Cola Drink: Large
Dùng Loop đọc tham số dòng lệnh
- Dùng khi số option/argument không biết trước
- Ví dụ cung cấp danh sách nguyên liệu công thức
- Dùng biến built-in $@, chứa mảng tất cả input option user truyền
Ví dụ
recipe.sh
#!/bin/bash i=1; # Giá trị iterator - số loop đã hoàn thành for ingredient in "$@" # loop qua $@ mảng tất cả tham số truyền do echo "Nguyen lieu so $i la $ingredient";; # In $ingredient truyền khi gọi script i=$((i + 1)); # Tăng iterator done
Chạy:
sh ./recipe.sh bread lettuce cheese hamburger
Kết quả:
Nguyen lieu so 1 la bread Nguyen lieu so 2 la lettuce Nguyen lieu so 3 la cheese Nguyen lieu so 4 la hamburger