Jak vložit proměnné do řetězce obsahujícího “ ”?

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> 

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *