Haluan rakentaa xml-merkkijonon kirjoittamalla muuttujat:
str1="Hello" str2="world" xml="<?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2>" echo $xml
Tulos pitäisi olla
<?xml version="1.0" encoding="iso-8859-1"?><tag1>Hello</tag1><tag2>world</tag2>
Mutta mitä saan:
<?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2>
Yritin myös
xml="<?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2>"
Mutta tämä poistaa sisäiset lainausmerkit ja antaa:
<?xml version=1.0 encoding=iso-8859-1?><tag1>hello</tag1><tag2>world</tag2>
kommentteja
- XML-asiakirjassa ei voi olla kahta ylätason tagia. Lisäksi ' s 2016, suosittelen voimakkaasti utf-8: n, ei iso-8859-1: n käyttöä.
vastaus
Voit upottaa muuttujia vain kaksoislainausmerkkijonoihin.
Helppo ja turvallinen tapa tehdä tämä työ on irrottautua yhden lainauksen merkkijonosta tällä tavalla:
xml="<?xml version="1.0" encoding="iso-8859-1"?><tag1>""$str1""</tag1><tag2>""$str2""</tag2>"
Huomaa, että yhden lainausmerkkijonon purkamisen jälkeen sulki muuttujat kaksinkertaisen lainausmerkit. Tämä tekee erityismerkkien käyttämisestä muuttujien sisällä turvallista.
Koska pyysit toista tapaa, tässä on huonompi vaihtoehto käyttämällä printf
:
xml=$(printf "<?xml version="1.0" encoding="iso-8859-1"?><tag1>%s</tag1><tag2>%s</tag2>" "$str1" "$str2")
Tämä on huonompaa, koska siinä käytetään alikuorta saman vaikutuksen saavuttamiseksi, mikä on tarpeetonta ylimääräistä prosessia.
Kuten @steeldriver kirjoitti kommentissa. Bashin nykyaikaisissa versioissa voit kirjoittaa näin välttääksesi alikuoren:
printf -v xml " ... " "$str1" "$str2"
Koska printf
on sisäänrakennettu kuori, tämä vaihtoehto on todennäköisesti osittain ensimmäinen ehdotukseni yläosassa.
Vastaa
Muuttujan laajennusta ei tapahdu yksittäisissä lainausmerkeissä.
Voit käyttää merkkijonossa kaksoislainauksia ja välttää kaksoislainausmerkit sisällä kanssa \
. Näin:
xml="<?xml version=\"1.0\" encoding=\"iso-8859-1\"?><tag1>$str1</tag1><tag2>$str2</tag2>"
Tuloksen tulos:
<?xml version="1.0" encoding="iso-8859-1"?><tag1>hello</tag1><tag2>world</tag2>