Bagaimana cara memasukkan variabel ke dalam string yang berisi ""?


25

Saya ingin membuat string xml dengan memasukkan variabel:

str1="Hello"
str2="world"

xml='<?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2>'

echo $xml

Hasilnya seharusnya

<?xml version="1.0" encoding="iso-8859-1"?><tag1>Hello</tag1><tag2>world</tag2>

Tapi yang saya dapatkan adalah:

<?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2>

Saya juga mencoba

xml="<?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2>"

Tetapi itu menghilangkan kutip ganda dalam dan memberi:

<?xml version=1.0 encoding=iso-8859-1?><tag1>hello</tag1><tag2>world</tag2>

2
Dokumen XML tidak boleh memiliki 2 tag tingkat atas. Juga, ini tahun 2016, saya sangat merekomendasikan menggunakan utf-8, bukan iso-8859-1.
Celada

Jawaban:


29

Anda bisa menanamkan variabel hanya dalam string yang dikutip ganda.

Cara mudah dan aman untuk membuat karya ini adalah dengan keluar dari string yang dikutip tunggal seperti ini:

xml='<?xml version="1.0" encoding="iso-8859-1"?><tag1>'"$str1"'</tag1><tag2>'"$str2"'</tag2>'

Perhatikan bahwa setelah keluar dari string tanda kutip tunggal, saya menyertakan variabel dalam tanda kutip ganda. Ini untuk membuatnya aman untuk memiliki karakter khusus di dalam variabel.

Karena Anda meminta cara lain, inilah alternatif yang lebih rendah menggunakan printf:

xml=$(printf '<?xml version="1.0" encoding="iso-8859-1"?><tag1>%s</tag1><tag2>%s</tag2>' "$str1" "$str2")

Ini lebih rendah karena menggunakan sub-shell untuk mencapai efek yang sama, yang merupakan proses tambahan yang tidak perlu.

Seperti @steeldriver menulis dalam komentar, dalam versi modern dari bash, Anda dapat menulis seperti ini untuk menghindari sub-shell:

printf -v xml ' ... ' "$str1" "$str2"

Karena printfshell builtin, alternatif ini mungkin sebagian dengan saran pertama saya di atas.


7

Ekspansi variabel tidak terjadi dalam string kutipan tunggal.

Anda dapat menggunakan tanda kutip ganda untuk string Anda, dan lolos dari tanda kutip ganda di dalamnya \. Seperti ini :

xml="<?xml version=\"1.0\" encoding=\"iso-8859-1\"?><tag1>$str1</tag1><tag2>$str2</tag2>"

Output hasil:

<?xml version="1.0" encoding="iso-8859-1"?><tag1>hello</tag1><tag2>world</tag2>
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.