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

17

Eu 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 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>
    
por supermario 25.12.2016 / 14:18

2 respostas

18

Você pode incorporar variáveis apenas em strings com aspas duplas.

Uma maneira fácil e segura de fazer isso funcionar é separar a sequência de aspas simples assim:

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

Observe que, após a quebra da string entre aspas simples, coloquei as variáveis entre aspas duplas. Isto é 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"

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

    
por 25.12.2016 / 14:23
1

A expansão de variáveis não acontece em strings de aspas simples.

Você pode usar aspas duplas para sua string e escapar as aspas duplas dentro de \ . 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>
    
por 25.12.2016 / 20:47