Wie füge ich Variablen in einen String ein, der "" enthält?

25

Ich möchte eine XML-Zeichenfolge durch Einfügen von Variablen erstellen:

str1="Hello"
str2="world"

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

echo $xml

Das Ergebnis sollte sein

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

Aber was ich bekomme ist:

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

Ich habe es auch versucht

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

Aber das entfernt die inneren doppelten Anführungszeichen und gibt:

<?xml version=1.0 encoding=iso-8859-1?><tag1>hello</tag1><tag2>world</tag2>
Super Mario
quelle
2
Ein XML-Dokument kann nicht zwei Tags der obersten Ebene enthalten. Außerdem ist es 2016, ich würde dringend empfehlen, utf-8 zu verwenden, nicht iso-8859-1.
Celada

Antworten:

29

Sie können Variablen nur in doppelte Anführungszeichen einbetten.

Eine einfache und sichere Möglichkeit, diese Arbeit zu erledigen, besteht darin, aus der Zeichenfolge in Anführungszeichen wie folgt auszubrechen:

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

Beachten Sie, dass ich die Variablen nach dem Aufbrechen der Zeichenfolge in doppelte Anführungszeichen eingeschlossen habe. Dies dient der Sicherheit, Sonderzeichen in den Variablen zu haben.

Da Sie nach einem anderen Weg gefragt haben, finden Sie hier eine minderwertige Alternative printf:

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

Dies ist minderwertig, da eine Unterschale verwendet wird, um den gleichen Effekt zu erzielen, was ein unnötiger zusätzlicher Prozess ist.

Wie @steeldriver in einem Kommentar schrieb, können Sie in modernen Versionen von bash folgendermaßen schreiben, um die Unterschale zu umgehen:

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

Da printfes sich um eine eingebaute Shell handelt, ist diese Alternative wahrscheinlich Teil meines ersten Vorschlags oben.

Hör auf, Monica weiter zu schaden
quelle
7

Die variable Erweiterung erfolgt nicht in Strings mit einfachen Anführungszeichen.

Sie können doppelte Anführungszeichen für Ihre Zeichenfolge verwenden und die darin enthaltenen doppelten Anführungszeichen mit entziehen \. So was :

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

Die Ergebnisausgabe:

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