Como inserir variáveis ​​dentro de uma string contendo “”?

25

Eu quero construir uma seqüência de caracteres 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 eu 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>
supermario
fonte
2
Um documento XML não pode ter duas tags de nível superior. Além disso, é de 2016, eu fortemente recomendo usar utf-8, não iso-8859-1.
Celada

Respostas:

29

Você pode incorporar variáveis ​​apenas em cadeias de caracteres entre aspas duplas.

Uma maneira fácil e segura de fazer esse trabalho é romper a cadeia de citação única assim:

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

Observe que, depois de quebrar a string de aspas simples, coloquei as variáveis ​​entre aspas duplas. Isso é para tornar seguro ter caracteres especiais dentro das variáveis.

Como 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 uma subcasca para obter o mesmo efeito, que é um processo extra desnecessário.

Como o @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"

Como printfé um shell embutido, essa alternativa provavelmente está em parte com a minha primeira sugestão no topo.

Pare o dano contínuo a Monica
fonte
7

A expansão variável não ocorre em cadeias de aspas simples.

Você pode usar aspas duplas para sua string e escapar das aspas duplas dentro de \. Como isso :

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>
Sidahmed
fonte