Hur infogar jag variabler i en sträng som innehåller “ ”?

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> 

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *