“” İçeren bir dize içine değişkenler nasıl eklenir?


25

Değişkenleri ekleyerek bir xml dizesi oluşturmak istiyorum:

str1="Hello"
str2="world"

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

echo $xml

Sonuç olmalıdır

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

Ama anladığım şey:

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

Ben de denedim

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

Ancak bu, içteki çift tırnak işaretini kaldırır ve verir:

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

2
Bir XML belgesinde 2 üst düzey etiket bulunamaz. Ayrıca 2016, iso-8859-1 değil utf-8 kullanmanızı şiddetle tavsiye ediyorum .
Celada

Yanıtlar:


29

Değişkenleri yalnızca çift tırnaklı dizelere gömebilirsiniz.

Bu işi yapmanın kolay ve güvenli bir yolu, aşağıdaki gibi tek alıntı dizgeden çıkmaktır:

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

Tek tırnaklı dizgeden ayrıldıktan sonra değişkenleri çift tırnak içine aldığımı fark et. Bu, değişkenlerin içinde özel karakterlerin olmasını güvenli kılmak içindir.

Başka bir yol istediğinden beri, işte aşağıdakini kullanarak alternatif bir alternatif printf:

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

Bu düşüktür, çünkü aynı etkiyi elde etmek için gereksiz bir işlem olan alt kabuğu kullanır.

@ Steeldriver'ın bir yorumunda yazdığı gibi, bash'ın modern versiyonlarında, alt kabuğu önlemek için şöyle yazabilirsiniz:

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

Yana printfbir kabuk yerleşiğidir, bu alternatif üstündeki ilk öneriyle kısmında muhtemelen.


7

Tek tırnaklı dizgelerde değişken genişleme gerçekleşmez.

Dize için çift tırnak kullanabilir ve içindeki çift tırnak işaretini kullanabilirsiniz \. Bunun gibi :

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

Sonuç çıktısı:

<?xml version="1.0" encoding="iso-8859-1"?><tag1>hello</tag1><tag2>world</tag2>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.