假设我有一个包含文本行的文件 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
这里,创建的两个数组是texts
和mails
。"${#texts[@]}"
表示 array 中的总行数,每行可以通过或 来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}