Jag vill konstruera en xml-sträng genom att infoga variabler:
str1="Hello" str2="world" xml="<?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2>" echo $xml
Resultatet ska vara
<?xml version="1.0" encoding="iso-8859-1"?><tag1>Hello</tag1><tag2>world</tag2>
Men vad jag får är:
<?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2>
Jag försökte också
xml="<?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2>"
Men det tar bort de inre dubbla citaten och ger:
<?xml version=1.0 encoding=iso-8859-1?><tag1>hello</tag1><tag2>world</tag2>
Kommentarer
- Ett XML-dokument kan inte ha två toppnivåtaggar. Det ' s 2016 skulle jag starkt rekommendera att använda utf-8, inte iso-8859-1.
Svar
Du kan bara bädda in variabler i dubbelt citerade strängar.
Ett enkelt och säkert sätt att få detta att fungera är för att bryta ut från den enda citerade strängen så här:
xml="<?xml version="1.0" encoding="iso-8859-1"?><tag1>""$str1""</tag1><tag2>""$str2""</tag2>"
Observera att efter att ha brutit ut från den enda citerade strängen, stängde jag in variablerna i dubbel- citat. Detta för att göra det säkert att ha specialtecken inuti variablerna.
Eftersom du bad om ett annat sätt är det här ett sämre alternativ med printf
:
xml=$(printf "<?xml version="1.0" encoding="iso-8859-1"?><tag1>%s</tag1><tag2>%s</tag2>" "$str1" "$str2")
Detta är sämre eftersom det använder ett underskal för att uppnå samma effekt, vilket är en onödig extra process.
Som @steeldriver skrev i en kommentar, i moderna versioner av bash kan du skriva så här för att undvika underskalet:
printf -v xml " ... " "$str1" "$str2"
Eftersom printf
är ett inbyggt skal är detta alternativ antagligen delvis med mitt första förslag högst upp.
Svar
Variabel expansion händer inte i strängar med enstaka citat.
Du kan använda dubbla citat för din sträng och slippa dubbla citat inuti med \
. Så här:
xml="<?xml version=\"1.0\" encoding=\"iso-8859-1\"?><tag1>$str1</tag1><tag2>$str2</tag2>"
Resultatutdata:
<?xml version="1.0" encoding="iso-8859-1"?><tag1>hello</tag1><tag2>world</tag2>