N行のテキストをリストのN番目のアドレスに送信します。

N行のテキストをリストのN番目のアドレスに送信します。

テキスト行を含むファイル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]}"ii+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}

関連情報