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

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> 

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *