Kuinka lisätä muuttujia merkkijonoon, joka sisältää “ ”?

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> 

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *