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