使用 bash 脚本创建 XML 文件

使用 bash 脚本创建 XML 文件

我想使用 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//&/&amp;}
    val=${val//</&lt;}
    val=${val//>/&gt;}
    val=${val//\'/&apos;}
    val=${val//\"/&quot;}
    printf %s "$val"
}

lorem="\"Foo\" & 'Bar' & <Baz>"

cat << EOF
<root><foo a="b">$(escape "$lorem")</foo><bar value="ipsum" /></root>
EOF

相关内容