Hvordan setter jeg inn variabler i en streng som inneholder “ ”?

Jeg vil konstruere en xml-streng ved å sette inn variabler:

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

Resultatet skal være

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

Men det jeg får er:

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

Jeg prøvde også

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

Men det fjerner de indre doble anførselstegnene og gir:

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

Kommentarer

  • Et XML-dokument kan ikke ha to toppkoder. Det ' s 2016 vil jeg sterkt anbefale å bruke utf-8, ikke iso-8859-1.

Svar

Du kan bare bygge inn variabler i dobbelt siterte strenger.

En enkel og trygg måte å få dette til å fungere er for å bryte ut av den enkelt siterte strengen slik:

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

Legg merke til at etter å ha brutt ut av den enkelt siterte strengen, lukket jeg variablene innenfor dobbelt- sitater. Dette er for å gjøre det trygt å ha spesialtegn i variablene.

Siden du ba om en annen måte, er dette et underordnet alternativ ved å bruke printf:

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

Dette er dårligere fordi det bruker et underskall for å oppnå samme effekt, noe som er en unødvendig ekstra prosess.

Som @steeldriver skrev i en kommentar, i moderne versjoner av bash, kan du skrive slik for å unngå underskallet:

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

Siden printf er et innebygd skall, er dette alternativet sannsynligvis delvis med mitt første forslag øverst.

Svar

Variabel utvidelse skjer ikke i strenger med enkelt anførselstegn.

Du kan bruke doble anførselstegn for strengen din, og unnslippe de dobbelte anførselstegnene inne med \. Slik:

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

Resultatutgangen:

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

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *