我需要将一些复杂的 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
这会将您的文本放入变量中,而无需转义引号。它还将处理不平衡的引号(撇号,即
'
)。在标记 (EOF) 周围加上引号可防止文本进行参数扩展。-d''
导致它读取多行(忽略换行符)。read
是内置的 Bash,因此不需要调用外部命令,例如cat
.你已经快到了。您可以使用cat来组装字符串,也可以引用整个字符串(在这种情况下,您必须转义字符串中的引号):
这在 Bourne shell 环境中应该可以正常工作
还有另一种方法来做同样的事情......
我喜欢在每行的开头使用变量和特殊
<<-
的列表来允许脚本缩进:警告:前面没有空格
一些解释:eof
,只有制表符。"${Pattern[*]}"
确实将此数组转换为字符串。IFS=";"
是因为没有;
必需的字符串while IFS=";" read file ...
脚本的其余部分阻止IFS
修改语法。在此,仅read
使用修改后的IFS
.在许多其他答案中有太多极端案例。
为了绝对确定空格、制表符、IFS 等没有问题,更好的方法是使用“heredoc”构造,但使用
uuencode
如下所述对heredoc 的内容进行编码:https://stackoverflow.com/questions/6896025/#11379627。