テキストファイルをループ処理する方法を理解する必要があります。すべての行でname、project#、およびemailのフィールドを取得し、送信するメールテンプレートでそれらを置き換えます。
したがって、これはsend.txtというテキストファイルです。
Project 1,Jack,Chen,06,12,[email protected]
Project 2,Emily,Weiss,06,12,[email protected]
Project 3,Mary,Gonzalas,06,12,[email protected]
これはReminder.emailというメールテンプレートです。
Dear __FULLNAME__:
This is a kindly reminder that our __Project__ meeting will be held on today.
Best Regards,
CIS5027
したがって、テキストファイルのすべての行について、このメールテンプレートで[〜#〜] fullname [〜#〜]:とProjectのフィールドを置き換える必要があります。最初の行で実行できる対応する値では、すべての行で実行できるわけではありません。
これは私のスクリプトです
#
!/bin/sh
#Start your code from here
date= date "+%m/%d/%y"
print $date
#The following line is to scan a file called Event-member.data and return any lines with todays date and save them to a file called sendtoday.txt
grep -n $(date +"%m,%d") Event-member.data > sendtoday.txt
#The following line is to remove the first to characters of the file created above sendtoday.txt and output that to a file called send.txt.
cat sendtoday.txt | sed 's/^..//' > send.txt
#This is where im having trouble. When storing the values for the variables below of name, email, project #. The value of NR==1 thus it never goes through the rest of the lines. I've tried different solutions but none seem to work.
p=$(awk -F ',' 'NR==1{print $1}' send.txt)
n=$(awk -F ',' 'NR==1{print $2}' send.txt)
l=$(awk -F ',' 'NR==1{print $3}' send.txt)
e=$(awk -F ',' 'NR==1{print $6}' send.txt)
echo $p $n $l $e
#This part is to replace the values in the email template using sed and save the modified template as sendnow.txt.
sed -e "s/__FULLNAME__:/\ $n $l :/g;s/__Project__/\ $p /g" Reminder.email > sendnow.txt
cat sendnow.txt
#Yet to be written ... send out modified email templates.
exit 0
########
これが生成する出力です。
06/12/14
Project 1 Jack Chen [email protected]
Dear Jack Chen :
This is a kindly reminder that our Project 1 meeting will be held on today.
Best Regards,
CIS5027
ご覧のとおり、フィールドは正しく置き換えられましたが、Jack Chenのみです。 send.txtファイルには3行が含まれていたため、上記のテンプレートの3つの変更されたバージョンが必要です。
これにawk
を使用する理由はありません。 read
を使用してシェルで直接実行できます。一般的な形式は_read foo bar
_で、最初のフィールドを_$foo
_として保存し、残りの各行を_$bar
_として保存します。したがって、あなたの場合、あなたは次のようなことをするでしょう:
_while IFS="," read p n l foo bar e; do
sed -e "s/__FULLNAME__:/\ $n $l :/g;s/__Project__/\ $p /g" Reminder.email;
done < file
_
IFS
は、_,
_に設定すると、コンマ区切りフィールドを読み取る入力フィールドセパレーターです。これにより、各フィールドを取得して変数に格納できます。 2つの追加変数foo
とbar
を使用したことに注意してください。これは、各フィールドに独自の変数名が必要であり、6つのフィールドがあるためです。 4つの変数名のみを指定した場合、4番目の(_$e
_)には4から最後までのフィールドが含まれます。
現在、スクリプトには他にもさまざまな構文エラーがあります。まず、Shebangの行が間違っています。_#! /bin/sh
_が必要です。_#!
_と_/bin/sh
_の間に空白行はありません。また、コマンドのoutputを変数に割り当てるには、_var=`command`
_または、できればvar=$(command)
フォーマット。それ以外の場合は、出力ではなく文字列としてのコマンド自体が変数に割り当てられます。最後に、 print
は、あなたが思っているものではありません。 printf
またはecho
を探しています。したがって、スクリプトを作成するより良い方法は次のとおりです。
_#!/bin/sh
date=$(date "+%m/%d/%y")
echo $date
## The following line is to scan a file called Event-member.data
## and return any lines with todays date and save them to a file
## called sendtoday.txt
grep -n $(date +"%m,%d") Event-member.data > sendtoday.txt
## The following line is to remove the first to characters of the file
## created above sendtoday.txt and output that to a file called
## send.txt.
## I rewrote this to avoid the useless use of cat.
sed 's/^..//' sendtoday.txt > send.txt
## This is where you use read
while IFS="," read p n l foo bar e; do
sed -e "s/__FULLNAME__:/\ $n $l :/g;s/__Project__/\ $p /g" Reminder.email > sendnow.txt
cat sendnow.txt
## This is where you need to add the code that sends the emails. Something
## like this:
sendmail $e < sendnow.txt
done < send.txt
exit 0
########
_
NR == 1の条件NR==1{print $1}
を使用しました。つまり、send.txt
の最初の行が考慮されます。 2行目を取得するには、NR == 2条件を使用します。 ORループを使用して、
while read line
do
p=`echo $line | awk -F '.' '{print $1}'`
n=`echo $line | awk -F '.' '{print $2}'`
l=`echo $line | awk -F '.' '{print $3}'`
e=`echo $line | awk -F '.' '{print $1}'`
sed -e "s/\__FULLNAME\__:/\ $n $l :/g;s/\__Project__/\ $p /g" Reminder.email > sendnow.txt
done<send.txt
多分あなたのスクリプトを次のようにラップする
for i in $(cat send.txt); do echo "line: $i"; done
?