Come inserire variabili allinterno di una stringa contenente “ ”?

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 virgolette doppie interne e restituisce:

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

Commenti

  • Un documento XML non può avere 2 tag di primo livello. Inoltre, nel ' 2016, consiglio vivamente di utilizzare utf-8, non iso-8859-1.

Risposta

Puoi incorporare variabili solo in stringhe tra virgolette.

Un modo semplice e sicuro per farlo funzionare è per rompere la stringa con virgolette singole in questo modo:

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

Notare che dopo aver rotto la stringa con virgolette singole, ho racchiuso le variabili allinterno citazioni. Questo per rendere sicuro avere caratteri speciali allinterno delle variabili.

Dato che hai chiesto un altro modo, ecco unalternativa inferiore usando printf:

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

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

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

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

Poiché printf è una shell incorporata, questa alternativa è probabilmente in parte con il mio primo suggerimento allinizio.

Risposta

Lespansione delle variabili non avviene nelle stringhe di virgolette singole.

Puoi utilizzare le virgolette doppie per la tua stringa ed evitare le virgolette doppie allinterno con \. In questo modo:

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

Loutput del risultato:

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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *