함수 내에서 함수 호출

함수 내에서 함수 호출

다양한 시간 범위에 대한 결과를 가져와 이메일을 통해 결과를 보내야 하는데 스크립트의 이메일 부분에 문제가 있습니다.

이 두 가지 결과가 포함된 이메일을 어떻게 보내나요? (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는 표준 유닉스 명령이고 당신이 그것을 사용하고 있다고 생각했기 때문에 나는 당신의 스크립트를 완전히 오해했습니다.

둘째, 이러한 내용을 메시지 파일에 전혀 쓸 필요가 없을 수도 있습니다. 대신   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( $vara로 시작 -하거나 개행 문자로 끝나거나 (일부 쉘의 경우) 백슬래시를 포함하지 않는 한). 또한 값을 $var전역 패턴 목록으로 사용하려는 의도가 아니라면 다음과 같이 작성해야 합니다 "$var"(값에 특수 문자가 포함되지 않는다는 점을 아는 경우는 제외).변수 대체에는 항상 큰따옴표를 사용하십시오.). 두 번의 루프 반복(하나는 bar값 으로 var, 다른 하나 bar는 값으로) 을 실행하려면 var2다음을 작성하십시오.

for bar in "$var" "$var2"; do
  func "$bar"
done

답변3

main은 함수입니다. 메인에서 호출하는 것과 같은 방식으로 호출됩니다.

관련 정보