如何在从BASH脚本发送的电子邮件中正确打印多行变量?

如何在从BASH脚本发送的电子邮件中正确打印多行变量?,bash,email,sendmail,netcat,Bash,Email,Sendmail,Netcat,我有一个BASH脚本,它运行各种系统管理函数和系统检查。如果检查失败,则将变量设置为1。可能发生的错误只有两种类型,因此我使用了名为的变量来描述错误,例如$login\u error和$timeout 在脚本结束时,如果遇到错误,将向我的团队发送一封电子邮件。在电子邮件中,我包含了一条简短的错误消息,描述了错误是什么。我遇到的问题是,错误消息包含\n字符,但我的嵌入式电子邮件没有保留换行符 我会告诉你我的意思。以下是检查故障并向我发送电子邮件的功能: checkFailure () {

我有一个BASH脚本,它运行各种系统管理函数和系统检查。如果检查失败,则将变量设置为
1
。可能发生的错误只有两种类型,因此我使用了名为的变量来描述错误,例如
$login\u error
$timeout

在脚本结束时,如果遇到错误,将向我的团队发送一封电子邮件。在电子邮件中,我包含了一条简短的错误消息,描述了错误是什么。我遇到的问题是,错误消息包含
\n
字符,但我的嵌入式电子邮件没有保留换行符

我会告诉你我的意思。以下是检查故障并向我发送电子邮件的功能:

checkFailure () {
    if [[ $error_encountered -eq 1 ]]; then

    [[ $timeout -eq 1 ]] && msg="Error 1: The device timed out\n"
    [[ $login_error -eq 1 ]] && msg="${msg}Error 2: Failed to login to device\n"
    [[ $sky_fall -eq 1 ]] && msg="${msg}Error 3: The sky is falling\n"

    { /usr/bin/nc <ip_of_my_sendmail_box> << EOF
mail from: server@domain.com
rcpt to: me@domain.com
data
to: me@domain.com
subject: Error during systems check
Content-Type: text/plain

$(printf "%b" "$msg")

Sent on: $(date)
.
quit
EOF
    } 1>/dev/null

}
为什么没有新线?

如果我将
$msg
文本更改为在末尾有两个
\n\n
字符,如下所示:

[[ $timeout -eq 1 ]] && msg="Error 1: The device timed out\n\n"
[[ $login_error -eq 1 ]] && msg="${msg}Error 2: Failed to login to device\n\n"
然后我在电子邮件中看到:

Error 1: The device timed out

Error 2: Failed to login to device
现在注意它们之间的额外新行。


有人知道为什么我要么没有换行符,要么有两个换行符,但从来没有想要的一个换行符。

您的子shell正在吐出换行符,但herdeoc扩展正在丢弃它,因为它没有引号

在shell中尝试
printf%b$msg
,查看想法


您需要使用类似于
printf%s\\n“$(printf%b“$msg”)”
的方法来获取所需内容。

您的子shell正在吐出换行符,但由于换行符不带引号,herdoc扩展正在丢弃它

在shell中尝试
printf%b$msg
,查看想法

您需要使用类似于
printf%s\\n“$(printf%b“$msg”)”
的方法来获取所需内容。

尝试:

尝试:


感谢Glenn和Etan的回复!然而,我认为我发现了这个问题

事实证明,问题更多的是Outlook(我用来阅读电子邮件)。它正在剥离那些特定线路的断线。我不知道为什么

我看到了

根据那篇文章的建议,我的修复方法是在每行
$msg
的末尾添加
/t
字符。这诱使Outlook不删除换行符

我不知道为什么我的heredoc的其他部分没有被Outlook删除换行符。例如,我还将一个日志文件
cat
导入到herdoc中,该文件中充满了新行,并且显示得很好。哦,好吧


编辑:Outlook也提供了有关此行为的良好信息。

感谢Glenn和Etan的回复!然而,我认为我发现了这个问题

事实证明,问题更多的是Outlook(我用来阅读电子邮件)。它正在剥离那些特定线路的断线。我不知道为什么

我看到了

根据那篇文章的建议,我的修复方法是在每行
$msg
的末尾添加
/t
字符。这诱使Outlook不删除换行符

我不知道为什么我的heredoc的其他部分没有被Outlook删除换行符。例如,我还将一个日志文件
cat
导入到herdoc中,该文件中充满了新行,并且显示得很好。哦,好吧


编辑:Outlook也提供了有关此行为的良好信息。

Hmm。。。似乎无法使用
printf%s\\n…
位代码。我很确定我需要用子shell打印/回显
$msg
变量,因为netcat电子邮件会话不会解释新行字符。在什么意义上不起作用?你得到了什么输出?是否在
$()
子shell中包含引号?如果你在heredoc输出的其他部分中得到换行符,nc不会成为问题。嗯。。。似乎无法使用
printf%s\\n…
位代码。我很确定我需要用子shell打印/回显
$msg
变量,因为netcat电子邮件会话不会解释新行字符。在什么意义上不起作用?你得到了什么输出?是否在
$()
子shell中包含引号?如果你在heredoc输出的其他部分中得到换行符,nc不会成为问题。有趣的是,当你发布这篇文章时,我刚刚读到了ANSI-C引用。谢谢你的信息;我最终在脚本中使用了你的代码块。我本想继续:我打赌你不需要
printf
:试着把
$msg
放在here-doc中。有趣的是,当你发布这篇文章时,我正在读ANSI-C报价。谢谢你的信息;最后我在脚本中使用了你的代码块。我本想继续:我打赌你不需要
printf
:试着把
$msg
放在here文档中。
Error 1: The device timed out

Error 2: Failed to login to device
msg=""
[[ $timeout     -eq 1 ]] && msg+=$'Error 1: The device timed out\n'
[[ $login_error -eq 1 ]] && msg+=$'Error 2: Failed to login to device\n'
[[ $sky_fall    -eq 1 ]] && msg+=$'Error 3: The sky is falling\n'