Chci sestavit řetězec XML vložením proměnných:
str1="Hello" str2="world" xml="<?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2>" echo $xml
Výsledek by měl být
<?xml version="1.0" encoding="iso-8859-1"?><tag1>Hello</tag1><tag2>world</tag2>
Ale to, co dostanu, je:
<?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2>
Zkoušel jsem také
xml="<?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2>"
Tím však odstraníte vnitřní dvojité uvozovky a získáte:
<?xml version=1.0 encoding=iso-8859-1?><tag1>hello</tag1><tag2>world</tag2>
Komentáře
- Dokument XML nemůže mít 2 značky nejvyšší úrovně. Rovněž ' s 2016 bych důrazně doporučil použít utf-8, ne iso-8859-1.
Odpověď
Proměnné můžete vložit pouze do řetězců s dvojitou uvozovkou.
Snadný a bezpečný způsob, jak tuto práci provést, je vymanit se z řetězce s jednou uvozovkou takto:
xml="<?xml version="1.0" encoding="iso-8859-1"?><tag1>""$str1""</tag1><tag2>""$str2""</tag2>"
Všimněte si, že po vylomení řetězce s jednou uvozovkou jsem proměnné uzavřel do dvojitého citáty. Tím zajistíte, že budou uvnitř proměnných bezpečné speciální znaky.
Jelikož jste požadovali jiný způsob, je zde nižší alternativa pomocí printf
:
xml=$(printf "<?xml version="1.0" encoding="iso-8859-1"?><tag1>%s</tag1><tag2>%s</tag2>" "$str1" "$str2")
Je to horší, protože k dosažení stejného efektu používá dílčí prostředí, což je zbytečný proces navíc.
Jako @steeldriver napsal do komentáře, v moderních verzích bash můžete psát takto, abyste se vyhnuli podsložce:
printf -v xml " ... " "$str1" "$str2"
Protože printf
je vestavěný shell, je tato alternativa pravděpodobně z části s mým prvním návrhem v horní části.
Odpověď
Variabilní expanze nenastává v řetězcích s jednoduchými uvozovkami.
Můžete použít dvojité uvozovky pro svůj řetězec a uniknout uvozovkám uvnitř pomocí \
. Například:
xml="<?xml version=\"1.0\" encoding=\"iso-8859-1\"?><tag1>$str1</tag1><tag2>$str2</tag2>"
Výsledek:
<?xml version="1.0" encoding="iso-8859-1"?><tag1>hello</tag1><tag2>world</tag2>