将复杂的多行字符串写入变量的简洁方法

将复杂的多行字符串写入变量的简洁方法

我需要将一些复杂的 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 的内容进行编码:

https://stackoverflow.com/questions/6896025/#11379627

相关内容