Jeg vil konstruere en xml-streng ved at indsætte 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 hvad jeg får er:
<?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2>
Jeg prøvede også
xml="<?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2>"
Men det fjerner de indre dobbelt anførselstegn og giver:
<?xml version=1.0 encoding=iso-8859-1?><tag1>hello</tag1><tag2>world</tag2>
Kommentarer
- Et XML-dokument kan ikke have to tags på øverste niveau. Det ' s 2016 vil jeg stærkt anbefale at bruge utf-8, ikke iso-8859-1.
Svar
Du kan kun integrere variabler i dobbelt-citerede strenge.
En nem og sikker måde at få dette til at arbejde på er for at bryde ud af den enkeltciterede streng som denne:
xml="<?xml version="1.0" encoding="iso-8859-1"?><tag1>""$str1""</tag1><tag2>""$str2""</tag2>"
Bemærk, at efter at have brudt ud af den enkeltciterede streng, lukkede jeg variablerne inden for dobbelt- citater. Dette er for at gøre det sikkert at have specialtegn inde i variablerne.
Da du bad om en anden måde, er her et ringere alternativ ved hjælp af printf
:
xml=$(printf "<?xml version="1.0" encoding="iso-8859-1"?><tag1>%s</tag1><tag2>%s</tag2>" "$str1" "$str2")
Dette er ringere, fordi det bruger en sub-shell til at opnå den samme effekt, hvilket er en unødvendig ekstra proces.
Som @steeldriver skrev i en kommentar, i moderne versioner af bash kan du skrive sådan for at undgå underskallen:
printf -v xml " ... " "$str1" "$str2"
Da printf
er en shell-indbygget, er dette alternativ sandsynligvis delvist med mit første forslag øverst.
Svar
Variabel udvidelse sker ikke i strenge med et enkelt citat.
Du kan bruge dobbelt anførselstegn til din streng og undgå de dobbelte anførselstegn med \
. Sådan:
xml="<?xml version=\"1.0\" encoding=\"iso-8859-1\"?><tag1>$str1</tag1><tag2>$str2</tag2>"
Resultatoutput:
<?xml version="1.0" encoding="iso-8859-1"?><tag1>hello</tag1><tag2>world</tag2>