세부 이름, 시작 날짜, 종료 날짜가 포함된 .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========"
루프 후에 읽은 변수의 값은 여전히 비어 있지만 이메일 전송 필요성은 테스트 및 인쇄되었습니다.