詳細名、開始日、終了日を含む.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========"
ループ後に読み取った変数の値はまだ空ですが、電子メール送信の必要性はテストされ印刷されました。