Cum se inserează variabile într-un șir care conține “ ”?

Vreau să construiesc un șir XML inserând variabile:

str1="Hello" str2="world" xml="<?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2>" echo $xml 

Rezultatul ar trebui să fie

<?xml version="1.0" encoding="iso-8859-1"?><tag1>Hello</tag1><tag2>world</tag2> 

Dar ceea ce primesc este:

<?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2> 

Am încercat și eu

xml="<?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2>" 

Dar asta elimină ghilimelele interioare și oferă:

<?xml version=1.0 encoding=iso-8859-1?><tag1>hello</tag1><tag2>world</tag2> 

Comentarii

  • Un document XML nu poate avea 2 etichete de nivel superior. De asemenea, este ' 2016, aș recomanda cu tărie utilizarea utf-8, nu iso-8859-1.

Răspuns

Puteți încorpora variabile numai în șiruri între ghilimele.

O modalitate ușoară și sigură de a face acest lucru este pentru a ieși din șirul citat simplu astfel:

xml="<?xml version="1.0" encoding="iso-8859-1"?><tag1>""$str1""</tag1><tag2>""$str2""</tag2>" 

Observați că după ieșirea din șirul citat simplu, am inclus variabilele în citate. Aceasta pentru a face în siguranță să aveți caractere speciale în interiorul variabilelor.

Deoarece ați cerut un alt mod, aici este o alternativă inferioară folosind printf:

xml=$(printf "<?xml version="1.0" encoding="iso-8859-1"?><tag1>%s</tag1><tag2>%s</tag2>" "$str1" "$str2") 

Acest lucru este inferior deoarece folosește un sub-shell pentru a obține același efect, ceea ce reprezintă un proces suplimentar inutil.

Ca @steeldriver a scris într-un comentariu, în versiunile moderne de bash, puteți scrie astfel pentru a evita sub-shell-ul:

printf -v xml " ... " "$str1" "$str2" 

Întrucât printf este un shell shell, această alternativă este probabil parțial cu prima mea sugestie în partea de sus.

Răspuns

Extinderea variabilă nu se întâmplă în șiruri de ghilimele simple.

Puteți utiliza ghilimele duble pentru șirul dvs. și puteți scăpa ghilimele duble din interior cu \. Astfel:

xml="<?xml version=\"1.0\" encoding=\"iso-8859-1\"?><tag1>$str1</tag1><tag2>$str2</tag2>" 

Rezultatul rezultat:

<?xml version="1.0" encoding="iso-8859-1"?><tag1>hello</tag1><tag2>world</tag2> 

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *