다양한 시간 범위에 대한 결과를 가져와 이메일을 통해 결과를 보내야 하는데 스크립트의 이메일 부분에 문제가 있습니다.
이 두 가지 결과가 포함된 이메일을 어떻게 보내나요? (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
( $var
a로 시작 -
하거나 개행 문자로 끝나거나 (일부 쉘의 경우) 백슬래시를 포함하지 않는 한). 또한 값을 $var
전역 패턴 목록으로 사용하려는 의도가 아니라면 다음과 같이 작성해야 합니다 "$var"
(값에 특수 문자가 포함되지 않는다는 점을 아는 경우는 제외).변수 대체에는 항상 큰따옴표를 사용하십시오.). 두 번의 루프 반복(하나는 bar
값 으로 var
, 다른 하나 bar
는 값으로) 을 실행하려면 var2
다음을 작성하십시오.
for bar in "$var" "$var2"; do
func "$bar"
done
답변3
main은 함수입니다. 메인에서 호출하는 것과 같은 방식으로 호출됩니다.