我需要将一些复杂的 xml 写入 bash 脚本中的变量。xml 需要在 bash 脚本中可读,因为这是 xml 片段所在的位置,它不会被从其他文件或源读取。
所以我的问题是,如果我有一个长字符串,我想让它在我的 bash 脚本中可供人类阅读,最好的方法是什么?
理想情况下我想要:
- 不必转义任何字符
- 将其拆分成多行,使其更易于阅读
- 保持缩进
这可以用 EOF 或其他东西来完成吗?有人可以给我举个例子吗?
例如
String = <<EOF
<?xml version="1.0" encoding='UTF-8'?>
<painting>
<img src="madonna.jpg" alt='Foligno Madonna, by Raphael'/>
<caption>This is Raphael's "Foligno" Madonna, painted in
<date>1511</date>-<date>1512</date>.</caption>
</painting>
EOF
答案1
这会将您的文本放入变量中,而无需转义引号。它还将处理不平衡的引号(撇号,即'
)。在标记(EOF)周围加上引号可防止文本进行参数扩展。-d''
导致它读取多行(忽略换行符)。read
是 Bash 内置的,因此它不需要调用外部命令,例如cat
。
IFS='' read -r -d '' String <<"EOF"
<?xml version="1.0" encoding='UTF-8'?>
<painting>
<img src="madonna.jpg" alt='Foligno Madonna, by Raphael'/>
<caption>This is Raphael's "Foligno" Madonna, painted in
<date>1511</date>-<date>1512</date>.</caption>
</painting>
EOF
答案2
你已经快到了。你可以使用猫用于组合你的字符串或者引用整个字符串(在这种情况下你必须转义字符串内的引号):
#!/bin/sh
VAR1=$(cat <<EOF
<?xml version="1.0" encoding='UTF-8'?>
<painting>
<img src="madonna.jpg" alt='Foligno Madonna, by Raphael'/>
<caption>This is Raphael's "Foligno" Madonna, painted in
<date>1511</date>-<date>1512</date>.</caption>
</painting>
EOF
)
VAR2="<?xml version=\"1.0\" encoding='UTF-8'?>
<painting>
<img src=\"madonna.jpg\" alt='Foligno Madonna, by Raphael'/>
<caption>This is Raphael's \"Foligno\" Madonna, painted in
<date>1511</date>-<date>1512</date>.</caption>
</painting>"
echo "${VAR1}"
echo "${VAR2}"
答案3
#!/bin/sh
VAR1=`cat <<EOF
<?xml version="1.0" encoding='UTF-8'?>
<painting>
<img src="madonna.jpg" alt='Foligno Madonna, by Raphael'/>
<caption>This is Raphael's "Foligno" Madonna, painted in
<date>1511</date>-<date>1512</date>.</caption>
</painting>
EOF
`
echo "VAR1: ${VAR1}"
这应该在 Bourne shell 环境中正常工作
答案4
其他很多答案中都有太多极端情况。
为了绝对确保没有空格、制表符、IFS 等问题,更好的方法是使用“heredoc”构造,但使用uuencode
如下所述对 heredoc 的内容进行编码: