我需要获取不同时间范围的结果并通过电子邮件发送结果,但我在脚本的电子邮件部分遇到问题,
我如何发送包含这两个结果的电子邮件? (15 分钟范围和累积结果)如下:
echo -e "Enter Start hour : xx:00:00"#ask user to input base time
read tI
echo "Select minute range, Enter 1 to 4"#ask user to select minute range
echo -e "\t1) XX:15:00 \n\t2) XX:15-30 | XX:30 \n\t3) XX:30-45 | xx:45 \n\t4) XX:45-00 | 1hour"
read NUM
if [ "$NUM" == "1" ] ; then
for Time in "$tI:(0[0-9]|1[0-4]:[0-5][0-9]|$tI:15" ; do #time grep c/o of Caleb, thanks!
mail
done
elif [ "$NUM" -eq "2" ] ; then
for Time in "$tI:(1[5-9]|2[0-9]:[0-5][0-9]|$tI:30)" "$tI:([0-2][0-9]:[0-5][0-9]|$tI:30)" ; do # 2nd time was commulative
mail
done
elif [ $NUM -eq 3 ] ; then
for Time in "$tI:(3[0-9]|4[0-4]:[0-5][0-9]|$tI:45)" "$tI:([0-3][0-9]||4[0-4]:[0-5][0-9]|$tI:45)" ; do
mail
done
elif [ $NUM -eq 4 ] ; then
tI=${tI#${tI%%[!0]*}}
newTime=$((tI + 1))
sTime=`printf '%02d\n' "$tI"`
fTime=`printf '%02d\n' "$newTime"` # thanks to Gilles and Mark and geekosaur
for Time in "$sTime:(4[5-9]|5[0-9]:[0-5][0-9]|$fTime:00)" "$sTime:([0-5][0-9]|[0-5][0-9]|$fTime:00)" ; do
mail
done
else
exit 1
fi
exit 1
function Count()
{
textfile="/some/path/to/text.txt"
time="$1"
C=0
echo " " > $textfile
for ((d=0; d<12; d++))
do
dec110=`egrep "$GivenDate $time" * | grep -c "$var .. ${DECLINE[$d]}" | awk '{SUM += $1} END { print SUM }'`
COUNT[$C]="$SUMdec"
((C++))
.... so on and so fort
echo -e "tons of to be echoed above /n end of the results to be emailed" >> $emessage
}
现在这是我的问题:我尝试了几次尝试,但似乎没有一个能发挥应有的作用。
function mail()
{
echo "declarations above of this | start of message" > $emessage
for ((t=0; t<2; t++)) do
Count "$Time"
done
/bin/mail -s "$SUBJECT" "$EMAIL" < $emessage
echo -e "Email Sent!\n\n"
cat $emessage
}
-- 这将发送 1 封电子邮件,但仅显示第一个 grep 的结果,
function mail()
{
echo "Hi Team," > $emessage
Count "$Time"
/bin/mail -s "$SUBJECT" "$EMAIL" < $emessage
echo -e "Email Sent! \n\n"
cat $emessage
}
-- 如果我选择选项 2-4,将发送 2 封单独的电子邮件。
笔记 : 如果没有电子邮件部分,该脚本可以正常工作。
答案1
首先,不要使您的函数名称与普通系统上的命令相同。mail
是一个标准的unix命令,我完全误解了你的脚本,因为我以为你正在使用它。
其次,您可能根本不需要将这些内容写入消息文件。相反,请将该 mail
函数从脚本中的所有位置中取出。相反,只需将内容转储到 STDOUT。使用echo
或grep
您用来收集要发送的内容的任何其他工具。
然后将脚本的整个部分(涉及要在内部邮寄的输出)包装起来,{}
以便将所有输出集中在一起并将其通过管道发送到邮件。
echo "Enter start hour"
read var # stuff to do that won't get output to mail
{
echo "Heading for mail:"
grep stuff...
function_that_outputs
echo "Next heading:"
grep more_stuff...
another_function
} | send_to_administrator
function send_to_administrator () {
/bin/mail -s "$SUBJET" "$EMAIL"
echo "Confirm mail sent."
}
答案2
`echo $var`
相同$var
(除非$var
以 a 开头-
或以换行符结尾或(对于某些 shell)包含反斜杠)。此外,除非您确实打算将 的值$var
用作全局模式列表,否则您必须编写"$var"
(除非您知道该值不会包含任何特殊字符 - 但更简单的是始终在变量替换周围使用双引号)。如果您想运行循环的两次迭代,一次迭代的bar
值是 的值var
,一次迭代的值bar
是 的值var2
,那么只需编写
for bar in "$var" "$var2"; do
func "$bar"
done
答案3
main 是一个函数。它们的调用方式与您在 main 中调用的方式相同