我需要将一些复杂的 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
Run Code Online (Sandbox Code Playgroud)
Den*_*son 156
这会将您的文本放入您的变量中,而无需转义引号。它还将处理不平衡的引号(撇号,即'
)。在标记 (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
Run Code Online (Sandbox Code Playgroud)
jos*_*chi 34
你已经快到了。要么使用cat来组装字符串,要么引用整个字符串(在这种情况下,您必须对字符串中的引号进行转义):
#!/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}"
Run Code Online (Sandbox Code Playgroud)
小智 16
#!/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}"
Run Code Online (Sandbox Code Playgroud)
这在 Bourne shell 环境中应该可以正常工作
我喜欢使用变量和特殊的<<-
who在每行开头删除制表以允许脚本缩进:
#!/bin/bash
mapfile Pattern <<-eof
<?xml version="1.0" encoding='UTF-8'?>
<painting>
<img src="%s" alt='%s'/>
<caption>%s, painted in
<date>%s</date>-<date>%s</date>.</caption>
</painting>
eof
while IFS=";" read file alt caption start end ;do
printf "${Pattern[*]}" "$file" "$alt" "$caption" "$start" "$end"
done <<-eof
madonna.jpg;Foligno Madonna, by Raphael;This is Raphael's "Foligno" Madonna;1511;1512
eof
Run Code Online (Sandbox Code Playgroud)
警告:前面没有空格,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>
Run Code Online (Sandbox Code Playgroud)
一些解释:
"${Pattern[*]}"
确实将此数组转换为字符串。IFS=";"
是因为;
在必需的字符串中没有while IFS=";" read file ...
防止IFS
脚本的其余部分被修改。在这种情况下,只read
使用修改后的IFS
.