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

ループ後に読み取った変数の値はまだ空ですが、電子メール送信の必要性はテストされ印刷されました。

おすすめ記事