将第 N 行文本发送到列表中的第 N 个地址

将第 N 行文本发送到列表中的第 N 个地址

假设我有一个包含文本行的文件 BOD 和一个包含电子邮件地址的文件 ADDR。如何将 BOD 的第一行发送到 ADDR 中的第一个地址,将 BODIES 的第二行发送到 ADDR 中的第二行,...直到最后一行?

我知道您可以使用 shell 在 shell 中发送邮件

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

编辑:另一种方法是将每个文本和地址文件读取到单独的数组中,其中每个索引包含相应文件的一行,如下所示:

#!/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

这里,创建的两个数组是textsmails"${#texts[@]}"表示 array 中的总行数,每行可以通过或 来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}

相关内容