Bagaimana cara menggunakan variabel Bash (string) yang berisi tanda kutip dalam suatu perintah?

45

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
Reilly Beacom
sumber

Jawaban:

56

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
Gordon Davisson
sumber
Jezus Suci berhasil!
Slawomir
-2

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
Franck Lefort
sumber
5
echotidak menunjukkan apa yang Anda pikirkan. Coba printargs() { printf "'%s' " "$@"; echo; }; printargs $FLAGS; printargs "$FLAGS"lihat mengapa kedua opsi ini tidak berfungsi.
Gordon Davisson