如何在包含“”的字符串中插入变量?


25

我想通过插入变量来构造一个xml字符串:

str1="Hello"
str2="world"

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

echo $xml

结果应该是

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

但是我得到的是:

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

我也试过

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

但这会删除内部的双引号,并给出:

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

2
一个XML文档不能有2个顶级标签。另外,这是2016年,我强烈建议您使用utf-8,而不是iso-8859-1。
塞拉达

Answers:


29

您只能将变量嵌入双引号字符串中。

进行此工作的一种简单而安全的方法是打破单引号的字符串,如下所示:

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

请注意,在打破单引号字符串之后,我将变量括在双引号中。这是为了确保在变量内包含特殊字符是安全的。

由于您要求使用另一种方法,因此以下是使用printf以下方法的替代方法:

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

这是劣等的,因为它使用子外壳来实现相同的效果,这是不必要的额外过程。

正如@steeldriver在评论中所写的那样,在现代版本的bash中,您可以这样编写以避免使用sub-shell:

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

由于printf是内置的shell,因此这种选择可能部分与我在顶部的第一个建议有关。


7

单引号字符串中不会发生变量扩展。

您可以在字符串中使用双引号,并使用来对双引号进行转义\。像这样 :

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

结果输出:

<?xml version="1.0" encoding="iso-8859-1"?><tag1>hello</tag1><tag2>world</tag2>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.