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>