Đừng không sử dụng eval
! Nó có một rủi ro lớn là thực thi mã tùy ý.
BashFAQ-50 - Tôi đang cố đặt lệnh vào một biến, nhưng các trường hợp phức tạp luôn không thành công.
Đặt nó trong một mảng và mở rộng tất cả các từ có dấu ngoặc kép "${arr[@]}"
để không để xảy IFS
ra hiện tượng tách từ do Tách từ .
cmdArgs=()
cmdArgs=('date' '+%H:%M:%S')
và xem nội dung của mảng bên trong. Các declare -p
phép bạn xem nội dung của các bên trong mảng với mỗi tham số lệnh trong chỉ số riêng biệt. Nếu một đối số như vậy chứa khoảng trắng, trích dẫn bên trong khi thêm vào mảng sẽ ngăn nó bị tách do Tách từ.
declare -p cmdArgs
declare -a cmdArgs='([0]="date" [1]="+%H:%M:%S")'
và thực hiện các lệnh như
"${cmdArgs[@]}"
23:15:18
(hoặc) hoàn toàn sử dụng một bash
hàm để chạy lệnh,
cmd() {
date '+%H:%M:%S'
}
và gọi hàm chỉ là
cmd
POSIX sh
không có mảng, vì vậy cách gần nhất bạn có thể đến là tạo danh sách các phần tử trong các tham số vị trí. Đây là một sh
cách POSIX để chạy chương trình thư
# POSIX sh
# Usage: sendto subject address [address ...]
sendto() {
subject=$1
shift
first=1
for addr; do
if [ "$first" = 1 ]; then set --; first=0; fi
set -- "$@" --recipient="$addr"
done
if [ "$first" = 1 ]; then
echo "usage: sendto subject address [address ...]"
return 1
fi
MailTool --subject="$subject" "$@"
}
Lưu ý rằng cách tiếp cận này chỉ có thể xử lý các lệnh đơn giản mà không có chuyển hướng. Nó không thể xử lý chuyển hướng, đường ống, vòng lặp for / while, câu lệnh if, v.v.
Một trường hợp sử dụng phổ biến khác là khi chạy curl
với nhiều trường tiêu đề và tải trọng. Bạn luôn có thể xác định các args như bên dưới và gọi curl
trên nội dung mảng được mở rộng
curlArgs=('-H' "keyheader: value" '-H' "2ndkeyheader: 2ndvalue")
curl "${curlArgs[@]}"
Một vi dụ khac,
payload='{}'
hostURL='http://google.com'
authToken='someToken'
authHeader='Authorization:Bearer "'"$authToken"'"'
bây giờ các biến đã được xác định, hãy sử dụng một mảng để lưu trữ các args lệnh của bạn
curlCMD=(-X POST "$hostURL" --data "$payload" -H "Content-Type:application/json" -H "$authHeader")
và bây giờ thực hiện mở rộng được trích dẫn thích hợp
curl "${curlCMD[@]}"