¿Cómo insertar variables dentro de una cadena que contiene ""?

25

Quiero construir una cadena xml insertando variables:

str1="Hello"
str2="world"

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

echo $xml

El resultado debería ser

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

Pero lo que obtengo es:

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

También intenté

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

Pero eso elimina las comillas dobles internas y da:

<?xml version=1.0 encoding=iso-8859-1?><tag1>hello</tag1><tag2>world</tag2>
Super Mario
fuente
2
Un documento XML no puede tener 2 etiquetas de nivel superior. Además, es 2016, recomendaría encarecidamente usar utf-8, no iso-8859-1.
Celada

Respuestas:

29

Puede incrustar variables solo en cadenas entre comillas dobles.

Una manera fácil y segura de hacer que esto funcione es salir de la cadena entre comillas simples de esta manera:

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

Tenga en cuenta que después de salir de la cadena entre comillas simples, encerré las variables entre comillas dobles. Esto es para que sea seguro tener caracteres especiales dentro de las variables.

Como solicitó otra forma, aquí hay una alternativa inferior usando printf:

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

Esto es inferior porque utiliza un sub-shell para lograr el mismo efecto, que es un proceso adicional innecesario.

Como @steeldriver escribió en un comentario, en las versiones modernas de bash, puede escribir así para evitar el sub-shell:

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

Dado que printfes un shell incorporado, esta alternativa es probablemente en parte con mi primera sugerencia en la parte superior.

Detener el daño continuo a Mónica
fuente
7

La expansión variable no ocurre en cadenas de comillas simples.

Puede usar comillas dobles para su cadena y escapar de las comillas dobles en el interior con \. Me gusta esto :

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

El resultado resultante:

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