将 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 日期,你可以这样做:

$ 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========"

循环后读取变量的值仍然为空,但发送电子邮件的需求已经经过测试(并打印)。

相关内容