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 probé
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>
Comentarios
- Un documento XML no puede tener 2 etiquetas de nivel superior. Además, ' s 2016, recomendaría encarecidamente usar utf-8, no iso-8859-1.
Respuesta
Puede insertar variables solo en cadenas entre comillas dobles.
Una forma fácil y segura de hacer que esto funcione es para 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>"
Observe que después de romper la cadena entre comillas simples, encerré las variables entre dobles citas. Esto es para que sea seguro tener caracteres especiales dentro de las variables.
Ya que 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 usa un sub-shell para lograr el mismo efecto, lo cual es un proceso adicional innecesario.
Como @steeldriver escribió en un comentario, en las versiones modernas de bash, puedes escribir así para evitar el sub-shell:
printf -v xml " ... " "$str1" "$str2"
Dado que printf
es un intérprete de órdenes integrado, esta alternativa probablemente sea parte de mi primera sugerencia en la parte superior.
Respuesta
La expansión de variables no ocurre en cadenas de comillas simples.
Puede usar comillas dobles para su cadena y escapar de las comillas dobles dentro con \
. Así:
xml="<?xml version=\"1.0\" encoding=\"iso-8859-1\"?><tag1>$str1</tag1><tag2>$str2</tag2>"
La salida del resultado:
<?xml version="1.0" encoding="iso-8859-1"?><tag1>hello</tag1><tag2>world</tag2>