![EndDate(.CSV 파일)를 오늘 날짜로 구분하여 30일 후에 만료되면 이메일을 보냅니다.](https://linux55.com/image/208391/EndDate(.CSV%20%ED%8C%8C%EC%9D%BC)%EB%A5%BC%20%EC%98%A4%EB%8A%98%20%EB%82%A0%EC%A7%9C%EB%A1%9C%20%EA%B5%AC%EB%B6%84%ED%95%98%EC%97%AC%2030%EC%9D%BC%20%ED%9B%84%EC%97%90%20%EB%A7%8C%EB%A3%8C%EB%90%98%EB%A9%B4%20%EC%9D%B4%EB%A9%94%EC%9D%BC%EC%9D%84%20%EB%B3%B4%EB%83%85%EB%8B%88%EB%8B%A4..png)
세부 이름, 시작 날짜, 종료 날짜가 포함된 .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========"
루프 후에 읽은 변수의 값은 여전히 비어 있지만 이메일 전송 필요성은 테스트 및 인쇄되었습니다.