EndDate(.CSV 파일)를 오늘 날짜로 구분하여 30일 후에 만료되면 이메일을 보냅니다.

EndDate(.CSV 파일)를 오늘 날짜로 구분하여 30일 후에 만료되면 이메일을 보냅니다.

세부 이름, 시작 날짜, 종료 날짜가 포함된 .csv 파일이 있습니다. .csv 파일에서 값을 읽어온 후 오늘 날짜와 비교하여 x일 후에 만료되면 이메일을 보냅니다. .csv에서 값을 읽은 후 조건 값을 가져올 수 없습니다. 도울 수 있니..

파일.csv:

Name: certificates, StartDate: Thu Dec 17 19:00:00 EST 2020, EndDate: Wed Dec 22 18:59:59 EST 2021
$ cat sample.sh
echo "=======Name, StartDate, EndDate Details============"
 
while IFS=, read -r Name StartDate EndDate;
do
    if [ -z "$EndDate" ]; then
        echo "$Validity details not exists"
    else
        echo "Name: $Name; StartDate: $StartDate; EndDate: $EndDate"
    fi  
done < file.csv

echo "=======$Name, StartDate, EndDate========"

내 출력은 다음과 같습니다. while 루프가 닫힌 후에 출력이 인쇄되지 않습니다.

$ sh sample.sh

=======Name, StartDate, EndDate Details============
Name: Name; StartDate: StartDate; EndDate: EndDate
Name:  sslcertificates; StartDate: Thu Dec 17 19:00:00 EST 2020; EndDate: Wed Dec 22 18:59:59 EST 2022
=======, , ========

예상 출력: EndDate(.CSV 파일)를 오늘 날짜와 비교하고 30일 후에 만료되면 이메일을 보내고 싶습니다.

미리 감사드립니다..

답변1

읽기 루프 내에서 변수를 사용해야 합니다. 읽은 변수 값이 루프 외부에서 값을 잃게 된다는 것은 잘 알려진(잘 문서화된) 사실입니다.

EndDate - Today몇 초 안에 계산을 해야 합니다 .

GNU Date가 있다고 가정하면 다음과 같이 할 수 있습니다.

$ cat sample.sh
echo "=======Name, StartDate, EndDate Details============"

TodayDateSec="$(date +'%s')"
 
while IFS=, read -r Name StartDate EndDate;
do
    if [ -z "$EndDate" ]; then
        echo "$Validity details not exists"
    else
        echo "Name: $Name; StartDate: $StartDate; EndDate: $EndDate"
        EndDateSec="$(date -d "$EndDate" +'%s')";
        DiffDays="$(( (EndDateSec - TodayDateSec)/86400 ))"
        if [[ "$DiffDays" -lt 30 ]]; then
              echo "Email needs to be sent"
        fi
    fi  
done < file.csv

echo "=======$Name, $StartDate, $EndDate========"

루프 후에 읽은 변수의 값은 여전히 ​​비어 있지만 이메일 전송 필요성은 테스트 및 인쇄되었습니다.

관련 정보