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