Jangan tidak menggunakan eval! Ini memiliki risiko besar untuk memperkenalkan eksekusi kode arbitrer.
BashFAQ-50 - Saya mencoba untuk meletakkan perintah dalam variabel, tetapi kasus yang kompleks selalu gagal.
Memasukkannya ke dalam array dan memperluas semua kata dengan tanda kutip ganda "${arr[@]}"untuk tidak membiarkan IFSperpecahan kata-kata karena Firman Memisahkan .
cmdArgs=()
cmdArgs=('date' '+%H:%M:%S')
dan melihat isi dari array di dalamnya. The declare -pmemungkinkan Anda melihat isi dalam array dengan masing-masing parameter perintah di indeks terpisah. Jika satu argumen seperti itu berisi spasi, mengutip di dalam sambil menambahkan ke array akan mencegahnya terpecah karena Pemisahan Kata.
declare -p cmdArgs
declare -a cmdArgs='([0]="date" [1]="+%H:%M:%S")'
dan jalankan perintah sebagai
"${cmdArgs[@]}"
23:15:18
(atau) semuanya menggunakan bashfungsi untuk menjalankan perintah,
cmd() {
date '+%H:%M:%S'
}
dan menyebut fungsinya sebagai adil
cmd
POSIX shtidak memiliki larik, jadi yang paling dekat yang bisa Anda lakukan adalah membuat daftar elemen dalam parameter posisi. Berikut shcara POSIX untuk menjalankan program email
# 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" "$@"
}
Perhatikan bahwa pendekatan ini hanya dapat menangani perintah sederhana tanpa pengalihan. Ia tidak dapat menangani pengalihan, pipeline, for / while loop, if statement, dll
Kasus penggunaan umum lainnya adalah saat menjalankan curlbeberapa kolom header dan payload. Anda selalu dapat menentukan args seperti di bawah ini dan memanggil curlkonten array yang diperluas
curlArgs=('-H' "keyheader: value" '-H' "2ndkeyheader: 2ndvalue")
curl "${curlArgs[@]}"
Contoh lain,
payload='{}'
hostURL='http://google.com'
authToken='someToken'
authHeader='Authorization:Bearer "'"$authToken"'"'
Sekarang variabel telah ditentukan, gunakan array untuk menyimpan perintah Anda args
curlCMD=(-X POST "$hostURL" --data "$payload" -H "Content-Type:application/json" -H "$authHeader")
dan sekarang lakukan ekspansi yang dikutip dengan benar
curl "${curlCMD[@]}"