さまざまな時間範囲の結果を取得し、電子メールで結果を送信する必要がありますが、スクリプトの電子メール部分に問題があります。
これら2つの結果を含むEメールをどのように送信しますか? (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つのEメールが送信されますが、最初の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で始まる-
か、改行文字で終わるか(一部のシェルの場合)、バックスラッシュを含まない限り)。また、値を$var
グローバルパターンリストとして使用することを意図していない場合は、次のように記述する必要があります"$var"
(値に特殊文字が含まれていないことを知らない限り)。変数の置換には常に二重引用符を使用してください。)。 2回のループ反復(1つのbar
値でvar
、もう1つbar
は値で)を実行するには、var2
次のようにします。
for bar in "$var" "$var2"; do
func "$bar"
done
答え3
main は関数です。メインから呼び出すのと同じ方法で呼び出されます。