Come inserire variabili all'interno di una stringa contenente ""?


25

Voglio costruire una stringa xml inserendo variabili:

str1="Hello"
str2="world"

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

echo $xml

Il risultato dovrebbe essere

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

Ma quello che ottengo è:

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

Ho anche provato

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

Ma ciò rimuove le doppie virgolette interne e dà:

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

2
Un documento XML non può avere 2 tag di livello superiore. Inoltre, è il 2016, consiglio vivamente di usare utf-8, non iso-8859-1.
Celada,

Risposte:


29

È possibile incorporare variabili solo in stringhe tra virgolette doppie.

Un modo semplice e sicuro per farlo funzionare è uscire dalla stringa a virgoletta singola in questo modo:

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

Si noti che dopo essere uscito dalla stringa tra virgolette singole, ho racchiuso le variabili tra virgolette doppie. Questo per rendere sicuro l'inserimento di caratteri speciali all'interno delle variabili.

Dato che hai chiesto un altro modo, ecco un'alternativa inferiore che utilizza printf:

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

Ciò è inferiore perché utilizza una sotto-shell per ottenere lo stesso effetto, che è un processo aggiuntivo non necessario.

Come ha scritto @steeldriver in un commento, nelle versioni moderne di bash, puoi scrivere in questo modo per evitare la sotto-shell:

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

Dato che printfè una shell integrata, questa alternativa è probabilmente parte del mio primo suggerimento in alto.


7

L'espansione delle variabili non avviene nelle stringhe a virgoletta singola.

Puoi usare le virgolette doppie per la tua stringa e sfuggire alle doppie virgolette all'interno con \. Come questo :

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

L'output del risultato:

<?xml version="1.0" encoding="iso-8859-1"?><tag1>hello</tag1><tag2>world</tag2>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.