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

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

我想通过插入变量来构造一个 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>

答案1

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

完成这项工作的一个简单而安全的方法是像这样打破单引号字符串:

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中,你可以这样写以避免子shell:

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

由于printf是 shell 内置的,因此这个替代方案可能是我在顶部的第一个建议的一部分。

答案2

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

您可以对字符串使用双引号,并使用 转义内部的双引号\。像这样 :

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>

相关内容