Gagal, contoh sederhana:
FLAGS='--archive --exclude="foo bar.txt"'
rsync $FLAGS dir1 dir2
Saya perlu memasukkan tanda kutip seolah-olah perintahnya seperti ini:
rsync --archive --exclude="foo bar.txt" dir1 dir2
Gagal, contoh sederhana:
FLAGS='--archive --exclude="foo bar.txt"'
rsync $FLAGS dir1 dir2
Saya perlu memasukkan tanda kutip seolah-olah perintahnya seperti ini:
rsync --archive --exclude="foo bar.txt" dir1 dir2
Jawaban:
Jawaban singkat: lihat BashFAQ # 50 ("Saya mencoba untuk menempatkan perintah dalam variabel, tetapi kasus kompleks selalu gagal!").
Jawaban panjang: Menempatkan perintah (atau bagian dari perintah) ke dalam variabel dan kemudian mengeluarkannya kembali menjadi rumit. Ketika shell memperluas variabel pada baris perintah, jika variabel dalam tanda kutip ganda itu tidak diuraikan; jika itu tidak ada dalam tanda kutip, spasi di dalamnya diuraikan sebagai argumen istirahat, tetapi kutipan dan melarikan diri tidak diuraikan. Dalam kedua kasus tersebut, menempatkan tanda kutip pada nilai variabel tidak ada gunanya.
Biasanya, cara terbaik untuk melakukan hal semacam ini adalah menggunakan array daripada variabel teks sederhana:
FLAGS=(--archive --exclude="foo bar.txt")
rsync "${FLAGS[@]}" dir1 dir2
eval adalah pilihan lain:
$ x="'a b'"
$ printf '%s,%s' $x
'a,b'
$ eval printf '%s,%s' $x
a b
Lihat juga:
Saya tidak melihat masalah:
$ FLAGS='--archive --exclude="foo bar.txt"'
$ echo $FLAGS
--archive --exclude="foo bar.txt"
Mungkin Anda perlu mengutip lagi nilainya:
$ rsync "$FLAGS" dir1 dir2
echo
tidak menunjukkan apa yang Anda pikirkan. Coba printargs() { printf "'%s' " "$@"; echo; }; printargs $FLAGS; printargs "$FLAGS"
lihat mengapa kedua opsi ini tidak berfungsi.