Envia a Nª linha de texto para o enésimo endereço na lista

0

Suponha que eu tenha um arquivo BOD que contenha linhas de texto e um arquivo ADDR que contenha endereços de e-mail. Como posso enviar a primeira linha do BOD para o primeiro endereço no ADDR, a segunda linha do BODIES para a segunda linha no ADDR, ... até a última linha?

Eu sei que você pode enviar um e-mail no shell usando

TEXT | mail ADDRESS

mas como você pode repetir essa tarefa para cada linha?

    
por Aldebaran 24.02.2016 / 10:58

2 respostas

1

Usando as seguintes variáveis,

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

Você pode escrever a seguinte rotina:

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   

Você pode usar seu script da seguinte maneira:

./script BOD ADDR

Editar: Uma maneira alternativa de fazer isso seria ler cada um dos arquivos de texto e endereço em matrizes separadas, onde cada índice contém uma linha do respectivo arquivo, como tal:

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

Aqui, os dois arrays criados são texts e mails . "${#texts[@]}" representa o número total de linhas na matriz texts , e cada linha pode ser acessada por "${texts[i]}" ou "${mails[i]}" , onde i inicia a partir de 0, contendo a linha i+1 do arquivo especificado.

    
por 24.02.2016 / 11:49
0
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}
    
por 24.02.2016 / 11:40