在 BASH 脚本中将日期插入到 "MAIL" 消息正文中
Inserting the date into a "MAIL" message body in a BASH script
我有一个相对简单的 BASH 脚本来从我的 Raspberry Pi 发送邮件。第一个参数是主题行,第二个是要附加的一串数据文件。
当我将消息正文指定为文件(第 6 行)时,它基本上可以正常工作。但是,如果我尝试创建一个包含日期作为消息正文的文本字符串,它会失败(第 7 行)。这是我的脚本:
#!/bin/bash
#echo
# To
TO="me@hotmail.com"
# Message
MESSAGE="output/MessageBody.txt"
MESSAGEx="Midnight `date '+%Y-%m-%d %H:%M:%S %Z'` Pi report"
echo $MESSAGE
echo $MESSAGEx
temp=$(echo | tr ";" "\n")
declare -a attargs
for att in $temp; do
attargs+=( "-A" "$att" )
done
# Sending email using /bin/mail
/usr/bin/mail -s "" "$TO" ${attargs[@]} < $MESSAGEx
这是此命令的输出
/usr/pgms/sendtome.sh "test message" "/mnt/usbdrive/output/JSONstart.txt;/mnt/usbdrive/output/Outback_error.log;/mnt/usbdrive/output/OutbackReaderPrint.txt"
当我将 MESSAGEx 指定为消息正文时:
/mnt/usbdrive/output/MessageBody.txt
Midnight 2019-08-14 07:40:31 MDT Pi report
/usr/pgms/sendtome.sh: line 22: $MESSAGEx: ambiguous redirect
如果我使用 MESSAGE,即文本文件引用,它就可以工作。
它如何创建包含日期或其他一些项目的邮件正文文本段落?谢谢....RDK
这里有很多问题。
- 你通常应该 quote strings. 没有引号,
<
之后的字符串被拆分(因此出现错误消息)并且你非常小心收集的数组将失去它的目的。
<
后面的东西需要是文件名。在 Bash 中,您可以在此处使用字符串 <<<"$MESSAGEx"
,但常见且简单的可移植解决方案是 echo
(或更好的 printf
)将其值放入管道中。
- 您的私有变量名应该更喜欢小写,但这主要是一种风格上的建议。 (有像
PATH
和 SHELL
这样的保留变量,您真的不想破坏它们;POSIX 保留大写变量名称供系统使用。)
这是一个试图解决这些问题的重构。
#!/bin/bash
to="me@hotmail.com"
# Message
#msgfile="output/MessageBody.txt"
msgbody="Midnight `date '+%Y-%m-%d %H:%M:%S %Z'` Pi report"
#echo "$msgfile"
#echo "$msgbody"
declare -a attargs
for att in $(echo "" | tr ";" "\n"); do
attargs+=( "-A" "$att" )
done
/usr/bin/mail -s "" "${attargs[@]}" "$to"<<< "$msgbody"
也许更好的设计是仅 shift
第一个参数,然后使用 "$@"
作为要附加的文件列表。
我有一个相对简单的 BASH 脚本来从我的 Raspberry Pi 发送邮件。第一个参数是主题行,第二个是要附加的一串数据文件。
当我将消息正文指定为文件(第 6 行)时,它基本上可以正常工作。但是,如果我尝试创建一个包含日期作为消息正文的文本字符串,它会失败(第 7 行)。这是我的脚本:
#!/bin/bash
#echo
# To
TO="me@hotmail.com"
# Message
MESSAGE="output/MessageBody.txt"
MESSAGEx="Midnight `date '+%Y-%m-%d %H:%M:%S %Z'` Pi report"
echo $MESSAGE
echo $MESSAGEx
temp=$(echo | tr ";" "\n")
declare -a attargs
for att in $temp; do
attargs+=( "-A" "$att" )
done
# Sending email using /bin/mail
/usr/bin/mail -s "" "$TO" ${attargs[@]} < $MESSAGEx
这是此命令的输出
/usr/pgms/sendtome.sh "test message" "/mnt/usbdrive/output/JSONstart.txt;/mnt/usbdrive/output/Outback_error.log;/mnt/usbdrive/output/OutbackReaderPrint.txt"
当我将 MESSAGEx 指定为消息正文时:
/mnt/usbdrive/output/MessageBody.txt
Midnight 2019-08-14 07:40:31 MDT Pi report
/usr/pgms/sendtome.sh: line 22: $MESSAGEx: ambiguous redirect
如果我使用 MESSAGE,即文本文件引用,它就可以工作。 它如何创建包含日期或其他一些项目的邮件正文文本段落?谢谢....RDK
这里有很多问题。
- 你通常应该 quote strings. 没有引号,
<
之后的字符串被拆分(因此出现错误消息)并且你非常小心收集的数组将失去它的目的。 <
后面的东西需要是文件名。在 Bash 中,您可以在此处使用字符串<<<"$MESSAGEx"
,但常见且简单的可移植解决方案是echo
(或更好的printf
)将其值放入管道中。- 您的私有变量名应该更喜欢小写,但这主要是一种风格上的建议。 (有像
PATH
和SHELL
这样的保留变量,您真的不想破坏它们;POSIX 保留大写变量名称供系统使用。)
这是一个试图解决这些问题的重构。
#!/bin/bash
to="me@hotmail.com"
# Message
#msgfile="output/MessageBody.txt"
msgbody="Midnight `date '+%Y-%m-%d %H:%M:%S %Z'` Pi report"
#echo "$msgfile"
#echo "$msgbody"
declare -a attargs
for att in $(echo "" | tr ";" "\n"); do
attargs+=( "-A" "$att" )
done
/usr/bin/mail -s "" "${attargs[@]}" "$to"<<< "$msgbody"
也许更好的设计是仅 shift
第一个参数,然后使用 "$@"
作为要附加的文件列表。