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 IFS
perpecahan kata-kata karena Firman Memisahkan .
cmdArgs=()
cmdArgs=('date' '+%H:%M:%S')
dan melihat isi dari array di dalamnya. The declare -p
memungkinkan 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 bash
fungsi untuk menjalankan perintah,
cmd() {
date '+%H:%M:%S'
}
dan menyebut fungsinya sebagai adil
cmd
POSIX sh
tidak memiliki larik, jadi yang paling dekat yang bisa Anda lakukan adalah membuat daftar elemen dalam parameter posisi. Berikut sh
cara 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 curl
beberapa kolom header dan payload. Anda selalu dapat menentukan args seperti di bawah ini dan memanggil curl
konten 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[@]}"