在函数内调用函数

在函数内调用函数

我需要获取不同时间范围的结果并通过电子邮件发送结果,但我在脚本的电子邮件部分遇到问题,

我如何发送包含这两个结果的电子邮件? (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。使用echogrep您用来收集要发送的内容的任何其他工具。

然后将脚本的整个部分(涉及要在内部邮寄的输出)包装起来,{}以便将所有输出集中在一起并将其通过管道发送到邮件。

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 中调用的方式相同

相关内容