Comment insérer des variables dans une chaîne contenant “ ”?

Je souhaite construire une chaîne xml en insérant des variables:

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

Le résultat devrait être

<?xml version="1.0" encoding="iso-8859-1"?><tag1>Hello</tag1><tag2>world</tag2> 

Mais ce que jobtiens est:

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

Jai aussi essayé

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

Mais cela supprime les doubles guillemets intérieurs et donne:

<?xml version=1.0 encoding=iso-8859-1?><tag1>hello</tag1><tag2>world</tag2> 

Commentaires

  • Un document XML ne peut pas avoir 2 balises de niveau supérieur. De plus, en ' 2016, je recommanderais fortement d’utiliser utf-8 et non iso-8859-1.

Réponse

Vous ne pouvez incorporer des variables que dans des chaînes entre guillemets.

Un moyen simple et sûr de faire ce travail est pour sortir de la chaîne entre guillemets simples comme ceci:

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

Notez quaprès avoir rompu la chaîne entre guillemets simples, jai enfermé les variables dans des doubles- devis. Cest pour éviter davoir des caractères spéciaux dans les variables.

Puisque vous avez demandé une autre méthode, voici une alternative inférieure en utilisant printf:

xml=$(printf "<?xml version="1.0" encoding="iso-8859-1"?><tag1>%s</tag1><tag2>%s</tag2>" "$str1" "$str2") 

Ceci est inférieur car il utilise un sous-shell pour obtenir le même effet, ce qui est un processus supplémentaire inutile.

Comme @steeldriver a écrit dans un commentaire, dans les versions modernes de bash, vous pouvez écrire comme ceci pour éviter le sous-shell:

printf -v xml " ... " "$str1" "$str2" 

Puisque printf est un shell intégré, cette alternative est probablement en partie avec ma première suggestion en haut.

Réponse

Lexpansion des variables ne se produit pas dans les chaînes de guillemets simples.

Vous pouvez utiliser des guillemets pour votre chaîne et échapper les guillemets à lintérieur avec \. Comme ceci:

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

La sortie du résultat:

<?xml version="1.0" encoding="iso-8859-1"?><tag1>hello</tag1><tag2>world</tag2> 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *