Gunakan eval:
x="ls | wc"
eval "$x"
y=$(eval "$x")
echo "$y"
Jangan jangan gunakan eval
! Ini memiliki risiko besar memperkenalkan eksekusi kode arbitrer.
BashFAQ-50 - Saya mencoba memasukkan perintah ke dalam variabel, tetapi kasus rumit selalu gagal.
Masukkan ke dalam array dan perluas semua kata dengan tanda kutip ganda "${arr[@]}"
untuk tidak biarkan IFS
pisahkan kata karena Pemisahan Kata.
cmdArgs=()
cmdArgs=('date' '+%H:%M:%S')
dan lihat isi array di dalamnya. declare -p
memungkinkan Anda melihat isi array di dalam dengan setiap parameter perintah dalam indeks terpisah. Jika salah satu argumen tersebut berisi spasi, mengutip di dalam sambil menambahkan ke larik akan mencegahnya terbelah 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
berfungsi untuk menjalankan perintah,
cmd() {
date '+%H:%M:%S'
}
dan panggil fungsi hanya sebagai
cmd
POSIX sh
tidak memiliki array, jadi hal terdekat yang bisa Anda lakukan adalah membuat daftar elemen dalam parameter posisi. Ini adalah sh
POSIX cara 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 -- "[email protected]" --recipient="$addr"
done
if [ "$first" = 1 ]; then
echo "usage: sendto subject address [address ...]"
return 1
fi
MailTool --subject="$subject" "[email protected]"
}
Perhatikan bahwa pendekatan ini hanya dapat menangani perintah sederhana tanpa pengalihan. Itu tidak dapat menangani pengalihan, saluran pipa, loop for/while, pernyataan if, dll
Kasus penggunaan umum lainnya adalah saat menjalankan curl
dengan beberapa bidang tajuk dan muatan. Anda selalu dapat mendefinisikan argumen seperti di bawah ini dan mengaktifkan curl
pada 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 setelah variabel ditentukan, gunakan larik untuk menyimpan perintah Anda args
curlCMD=(-X POST "$hostURL" --data "$payload" -H "Content-Type:application/json" -H "$authHeader")
dan sekarang lakukan perluasan kutipan yang tepat
curl "${curlCMD[@]}"
var=$(echo "asdf")
echo $var
# => asdf
Dengan menggunakan metode ini, perintah segera dievaluasi dan nilai pengembaliannya disimpan.
stored_date=$(date)
echo $stored_date
# => Thu Jan 15 10:57:16 EST 2015
# (wait a few seconds)
echo $stored_date
# => Thu Jan 15 10:57:16 EST 2015
Sama dengan backtick
stored_date=`date`
echo $stored_date
# => Thu Jan 15 11:02:19 EST 2015
# (wait a few seconds)
echo $stored_date
# => Thu Jan 15 11:02:19 EST 2015
Menggunakan eval di $(...)
tidak akan membuatnya dievaluasi nanti
stored_date=$(eval "date")
echo $stored_date
# => Thu Jan 15 11:05:30 EST 2015
# (wait a few seconds)
echo $stored_date
# => Thu Jan 15 11:05:30 EST 2015
Menggunakan eval, ini dievaluasi saat eval
digunakan
stored_date="date" # < storing the command itself
echo $(eval "$stored_date")
# => Thu Jan 15 11:07:05 EST 2015
# (wait a few seconds)
echo $(eval "$stored_date")
# => Thu Jan 15 11:07:16 EST 2015
# ^^ Time changed
Dalam contoh di atas, jika Anda perlu menjalankan perintah dengan argumen, masukkan ke dalam string yang Anda simpan
stored_date="date -u"
# ...
Untuk skrip bash, ini jarang relevan, tetapi satu catatan terakhir. Hati-hati dengan eval
. Evaluasi hanya string yang Anda kontrol, bukan string yang berasal dari pengguna yang tidak dipercaya atau dibuat dari masukan pengguna yang tidak dipercaya.
- Terima kasih kepada @CharlesDuffy karena telah mengingatkan saya untuk mengutip perintah!