N번째 줄의 텍스트를 목록의 N번째 주소로 보냅니다.

N번째 줄의 텍스트를 목록의 N번째 주소로 보냅니다.

텍스트 줄이 포함된 파일 BOD와 이메일 주소가 포함된 파일 ADDR이 있다고 가정해 보겠습니다. BOD의 첫 번째 줄을 ADDR의 첫 번째 주소로, BODIES의 두 번째 줄을 ADDR의 두 번째 줄로,...마지막 줄까지 어떻게 보내나요?

쉘을 사용하여 쉘에서 메일을 보낼 수 있다는 것을 알고 있습니다.

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[@]}"배열의 총 행 수를 나타냅니다. 각 행은 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}

관련 정보