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>