Bash 如何从shellscript获取电子邮件中的换行符?
有一个shell脚本(bash),用于检查csv文件中是否有不匹配模式的行,并发送错误行的邮件。这很好,但是当组合错误的行时,linux会给出一个\r换行符,但在电子邮件中没有换行符。所以我尝试以换行符的形式发送\r\n,但没有效果,perl或bash会删除\r\n换行符 以下是一个简单的工作脚本示例:Bash 如何从shellscript获取电子邮件中的换行符?,bash,perl,email,awk,sed,Bash,Perl,Email,Awk,Sed,有一个shell脚本(bash),用于检查csv文件中是否有不匹配模式的行,并发送错误行的邮件。这很好,但是当组合错误的行时,linux会给出一个\r换行符,但在电子邮件中没有换行符。所以我尝试以换行符的形式发送\r\n,但没有效果,perl或bash会删除\r\n换行符 以下是一个简单的工作脚本示例: SUBJECT="Error while parse CSV" TO="rcpt@domain.tld" wrongLines=$(perl -ne 'print "Row $.: $_\r\n
SUBJECT="Error while parse CSV"
TO="rcpt@domain.tld"
wrongLines=$(perl -ne 'print "Row $.: $_\r\n" if not /^00[1-9]\d{4,}$/' $file)
MESSAGE="Error while parse following Lines, pattern dont match: \r\n $wrongLines"
echo $MESSAGE |od -c
od的输出为:
0000000 E r r o r w h i l e p a r s
0000020 e f o l l o w i n g L i n e
0000040 s , p a t t e r n d o n t
0000060 m a t c h : \ r \ n R o w
0000100 2 : 4 9 2 7 8 3 8 7 4 3 \r R
0000120 o w 3 : 4 8 2 3 2 8 9 7 3 8
0000140 \r \n
0000143
但是在od输出中删除行之间的\n的原因是什么?我也尝试\x0D\x0A而不是\r\n,但这也没有帮助。有什么建议吗?你的问题是你没有使用引号 看: 如果没有引号,您将成为和的受害者(上面的示例中没有说明) 此外,添加
\r
或\n
(即逐字反斜杠后跟r或n)也没有任何帮助
结论:引用每个变量展开式!永远!(除非你真的是指一个glob模式——在这种情况下,你还将在代码中添加一条注释来解释为什么你故意不引用扩展)
旁注:
建议您对自己的参数使用小写名称,以免和Bash内部变量和环境变量使用的所有大写变量名称混淆
使用更多引号:
echo“$MESSAGE”
。你不想要\r
。也许你应该看看?或者改用?@gniourf\n序列\r\n
是许多基于文本的协议中的标准换行符。@JoachimPileborg:我的评论主要是关于使用引号…(我不确定反斜杠后跟r(或n)会起什么作用)。@gniourf\n使用正确的选项echo
(或者使用printf
)在以这种方式引入换行符和回车符的大多数其他环境中,反斜杠将按预期工作。关于引号的部分是正确且重要的。唯一奇怪的是,文本后面和concat之前的换行符在echo命令中也有一个没有引号的换行符。
$ a="A multi-line
input
variable"
$ echo $a
A multi-line input variable
$ echo "$a"
A multi-line
input
variable
$