Wie füge ich Variablen in eine Zeichenfolge ein, die “ ” enthält?

Ich möchte eine XML-Zeichenfolge erstellen, indem ich Variablen einfüge:

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>" 

Damit werden jedoch die inneren doppelten Anführungszeichen entfernt und Folgendes erhalten:

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

Kommentare

  • Ein XML-Dokument darf nicht über zwei Tags der obersten Ebene verfügen. Außerdem ' s 2016 würde ich dringend die Verwendung von utf-8 empfehlen, nicht von iso-8859-1.

Antwort

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

Eine einfache und sichere Möglichkeit, dies zu erreichen, ist: So brechen Sie aus der Zeichenfolge in einfachen Anführungszeichen aus:

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

Beachten Sie, dass ich nach dem Ausbrechen der Zeichenfolge in einfachen Anführungszeichen die Variablen in doppelte Zeichenfolgen eingeschlossen habe. Zitate. Dies soll sicherstellen, dass Sonderzeichen in den Variablen enthalten sind.

Da Sie nach einem anderen Weg gefragt haben, finden Sie hier eine minderwertige Alternative mit 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 denselben Effekt zu erzielen, was ein unnötiger zusätzlicher Prozess ist.

As @steeldriver schrieb in einem Kommentar, in modernen Versionen von bash können Sie so schreiben, um die Sub-Shell zu vermeiden:

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

Da printf eine eingebaute Shell ist, ist diese Alternative wahrscheinlich Teil meines ersten Vorschlags oben.

Antwort

Die Variablenerweiterung findet in Zeichenfolgen in einfachen Anführungszeichen nicht statt.

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

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> 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.