我想使用 bash 脚本(而不是 dom )创建简单的 xml 文件
但是当我在行中设置值时 回声打印 $lorem 单词而不是 val
洛雷姆=哈哈
echo '<root><foo a="b">$lorem</foo><bar value="ipsum" /></root>' >> $MY_XML
我也尝试
echo '<root><foo a="b">\$lorem</foo><bar value="ipsum" /></root>' >> $MY_XML
echo '<root><foo a="b">"$lorem"</foo><bar value="ipsum" /></root>' >> $MY_XML
echo '<root><foo a="b">\"$lorem\"</foo><bar value="ipsum" /></root>' >> $MY_XML
但所有这些都准确地打印了行而不是值
请建议如何打印 val $lorem ?如下例
<root><foo a="b">LOL</foo><bar value="ipsum" /></root>
答案1
将内联文档与 cat 一起使用
cat >destfile <<EOF
<your ZML here...where $vas expand happly>
but the rest remain as is
EOF
我在很多脚本中都使用了它。还请考虑envsubst 命令限制变量您可以在内联文档中使用。
答案2
以此方式打印该行:
echo '<root><foo a="b">'"$lorem"'</foo><bar value="ipsum" /></root>' >> "$MY_XML"
这是需要的,因为单引号拒绝 shell 解释器替换里面的环境变量
答案3
令人沮丧的是,您省略的组合之一可能会起作用:
echo "<root><foo a=\"b\">$lorem</foo><bar value=\"ipsum\" /></root>" >> $MY_XML
单引号使所有内容与您键入的内容完全相同。逃避是\
行不通的。双引号将评估字符串。在双引号内,您可以使用\
转义特定字符(包括双引号字符本身)。
您还可以组合以不同方式引用的字符串部分。在这里,$lorem
仍然用双引号引起来,但字符串的其余部分用单引号引起来:
echo '<root><foo a="b">'"$lorem"'</foo><bar value="ipsum" /></root>' >> $MY_XML
答案4
当您将值插入 XML 模板时,请确保转义特殊字符:
escape() {
local val
val=$1
val=${val//&/&}
val=${val//</<}
val=${val//>/>}
val=${val//\'/'}
val=${val//\"/"}
printf %s "$val"
}
lorem="\"Foo\" & 'Bar' & <Baz>"
cat << EOF
<root><foo a="b">$(escape "$lorem")</foo><bar value="ipsum" /></root>
EOF