Hvordan indsættes variabler inde i en streng, der indeholder “ ”?

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> 

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *