Quero construir uma string xml inserindo variáveis:
str1="Hello" str2="world" xml="<?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2>" echo $xml
O resultado deve ser
<?xml version="1.0" encoding="iso-8859-1"?><tag1>Hello</tag1><tag2>world</tag2>
Mas o que recebo é:
<?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2>
Eu também tentei
xml="<?xml version="1.0" encoding="iso-8859-1"?><tag1>$str1</tag1><tag2>$str2</tag2>"
Mas isso remove as aspas duplas internas e fornece:
<?xml version=1.0 encoding=iso-8859-1?><tag1>hello</tag1><tag2>world</tag2>
Comentários
- Um documento XML não pode ter 2 tags de nível superior. Além disso, em ' s 2016, eu recomendaria fortemente o uso de utf-8, não iso-8859-1.
Resposta
Você pode incorporar variáveis apenas em strings entre aspas.
Uma maneira fácil e segura de fazer isso funcionar é para quebrar a string entre aspas simples como este:
xml="<?xml version="1.0" encoding="iso-8859-1"?><tag1>""$str1""</tag1><tag2>""$str2""</tag2>"
Observe que, depois de quebrar a string entre aspas simples, coloquei as variáveis entre duas citações. Isso é para tornar seguro ter caracteres especiais dentro das variáveis.
Já que você pediu outra maneira, aqui está uma alternativa inferior usando printf
:
xml=$(printf "<?xml version="1.0" encoding="iso-8859-1"?><tag1>%s</tag1><tag2>%s</tag2>" "$str1" "$str2")
Isso é inferior porque usa um sub-shell para obter o mesmo efeito, que é um processo extra desnecessário.
Como @steeldriver escreveu em um comentário, nas versões modernas do bash, você pode escrever assim para evitar o sub-shell:
printf -v xml " ... " "$str1" "$str2"
Visto que printf
é um shell embutido, esta alternativa provavelmente faz parte da minha primeira sugestão no topo.
Resposta
A expansão da variável não acontece em strings com aspas simples.
Você pode usar aspas duplas para sua string e escapar as aspas dentro com \
. Assim:
xml="<?xml version=\"1.0\" encoding=\"iso-8859-1\"?><tag1>$str1</tag1><tag2>$str2</tag2>"
A saída do resultado:
<?xml version="1.0" encoding="iso-8859-1"?><tag1>hello</tag1><tag2>world</tag2>