テキスト行を含むファイルBODと電子メールアドレスを含むファイルADDRがあるとします。 BODの最初の行をADDRの最初のアドレスに、BODIESの2番目の行をADDRの2番目の行に、...最後の行までどのように送信しますか?
シェルを使用してシェルからメールを送信できることを知っています。
TEXT | mail ADDRESS
しかし、各行に対してこの操作をどのように繰り返すのですか?
答え1
次の変数を使用します。
text_file="$1"
mail_file="$2"
lines_in_text=$( cat "$text_file" | wc -l )
lines_in_addr=$( cat "$mail_file" | wc -l )
line_num=1
次のルーチンを作成できます。
send_mail() {
while [[ "$line_num" -le "$lines_in_text" ]]; do
text_line=$( sed -n "${line_num}p" "$text_file" )
mail_line=$( sed -n "${line_num}p" "$mail_file" )
echo "$text_line" | mail "$mail_line"
line_num=$(( line_num + 1 ))
done
}
send_mail
その後、次のようにスクリプトを使用できます。
./script BOD ADDR
編集する:別のアプローチは、各テキストファイルとアドレスファイルを別々の配列に読み込むことです。ここで、各インデックスには、次のようにそのファイルの1行が含まれています。
#!/bin/bash
IFS=$'\n' read -d '' -r -a texts < "$1"
IFS=$'\n' read -d '' -r -a mails < "$2"
send_mail_alternate() {
for (( i = 0; i < "${#texts[@]}"; i++ )); do
echo "${texts[i]}" | mail "${mails[i]}"
done
}
send_mail_alternate
ここで作成された2つの配列はとtexts
ですmails
。"${#texts[@]}"
配列の総行数を示します。各行はtexts
またはでアクセスできます。ここで0から始めて上に移動すると、指定されたファイルの行が含まれます。"${texts[i]}"
"${mails[i]}"
i
i+1
答え2
number=YOUR_NUMBER_OF_LINE
message=$(head -n ${number} file_wit_TEXT | tail -1)
address=$(head -n ${number} file_with_ADDRESSES | tail -1)
echo ${message} | mail ${address}