未正确替换shell脚本变量中的换行符
情况:使用shell脚本(bash/ksh),应该在控制台日志中显示一条消息,然后通过电子邮件发送 问题:消息中有换行符 示例如下:未正确替换shell脚本变量中的换行符,shell,unix,newline,Shell,Unix,Newline,情况:使用shell脚本(bash/ksh),应该在控制台日志中显示一条消息,然后通过电子邮件发送 问题:消息中有换行符 示例如下: ErrMsg="File names must be unique. Please correct and rerun. Duplicate names are listed below: File 1.txt File 1.txt File 2.txt File 2.txt File 2.txt" echo "${ErrMsg}" # OK.
ErrMsg="File names must be unique. Please correct and rerun.
Duplicate names are listed below:
File 1.txt
File 1.txt
File 2.txt
File 2.txt
File 2.txt"
echo "${ErrMsg}"
# OK. After showing the message in the console log, send an email
问题:如何将这些换行符转换为电子邮件的HTML换行符
约束:我们必须发送HTML电子邮件。下游流程(如Microsoft Outlook)太不一致,其他任何流程都无法使用。简单的文本电子邮件是一个很好的选择,但在这种情况下是不可能的
为了清楚起见,不需要完全删除换行符,但是只要有换行符,就必须插入HTML换行符
之所以提出这个问题,是因为我已经尝试过使用多个命令,例如
sed
、tr
、和awk
,并取得了不同程度的成功。TL;DR:以下代码片段将完成此工作:
ErrMsg=`echo "$ErrMsg"|awk 1 ORS='<br/>'`
使用awk
根据使用awk
最初似乎是可行的,但由于使用echo
的一些其他情况,出现了一个微妙的问题。该解决方案如中所述
必须在变量周围加上双引号,否则echo将删除所有换行符。(当然,
awk
将接收结尾带有换行符的字符,因为这是echo
在echo之后所做的。)
这个片段是好的:(中间的行中断被保存并正确替换)
您可以使用
将邮件包装在HTML
中,例如
<pre>
${ErrMsg}
and more.
</pre>
${ErrMsg}
还有更多。
这是一个很好的建议,但不幸的是,MS Outlook 2013不会自动尊重
中包装的文本换行符。。。所以消息仍然需要真正的HTML换行符。
ErrMsg=`echo "$ErrMsg"|awk 1 ORS='<br/>'`
ErrMsg=`echo $ErrMsg|awk 1 ORS='<br/>'`
<pre>
${ErrMsg}
and more.
</pre>