whileループ内の2つの日付の間の「日数」を取得する方法。無効な日付エラーを受け取りました。

whileループ内の2つの日付の間の「日数」を取得する方法。無効な日付エラーを受け取りました。

2日間の日数を取得しようとしていますが、証明書が30日以内に期限切れになった場合は、通知メールを送信する必要があります。 EndDate 2022年8月18日木曜日18:59:59 EST 2022に.csvファイルに電話をかけました。

ファイルsample3.csvには以下が含まれます。

$ cat sample3.csv
CertName,StartDate,EndDate
sslcertificates,Thu Dec 17 19:00:00 EST 2020,Thu Aug 18 18:59:59 EST 2022

/bin/date:無効な日付などのエラーが発生します。誰でも助けることができますか?私はスクリプトが初めてです。

#! /bin/bash
set +x
date=`/bin/date`
TodayDateSec="$(/bin/date "+%s")"
while IFS=, read -r CertName StartDate EndDate;
do
        if [ -z "$EndDate" ]; then
                echo "$EndDate details not exists"
        else
                echo "Name: $Name; StartDate: $StartDate; EndDate: $EndDate";
                date=`/bin/date`
                EndDateSec="$(/bin/date -d "$EndDate" +'%s')";
                DiffDays="$(( ( EndDateSec - TodayDateSec )/86400 ))"
                echo "***********$DiffDays************"
        if [[ "$DiffDays" -lt 30 ]]; then
                echo "Certificate is going to expire in $DiffDays. Please take required action"

        fi
    fi
done < sample3.csv

出力は次のとおりです。

Name: CertName; StartDate: StartDate; EndDate: EndDate
/bin/date: invalid date ‘EndDate’
***********-19195************
Certificate is going to expire in -19195. Please take required action Name: sslcertificates; StartDate: Thu Dec 17 19:00:00 EST 2020; EndDate: Thu Aug 18 18:59:59 EST 2022
/bin/date: invalid date ‘Thu Aug 18 18:59:59 EST 2022’
***********-19195************
Certificate is going to expire in -19195. Please take required action 

ベストアンサー1

いくつかの(単純な)データ検証を含むようにスクリプトを変更します。日付コマンドは、使用している日付形式を正しく理解できない可能性があります。これはさまざまな理由で発生する可能性があります。日付形式を「2022-08-18T18:59:59」と指定できれば、移植性が良く、他のプログラムで処理が容易になります。

#! /bin/bash
set +x

TodayDateSec="$(/bin/date "+%s")"

while IFS=, read -r CertName StartDate EndDate; do
        if [ -z "$EndDate" ]; then
                echo "$EndDate details not exists"
        elif ! /bin/date -d "$EndDate" >/dev/null 2>&1; do
                echo "Invalid date format supplied $EndDate"
        elif 
                EndDateSec="$(/bin/date -d "$EndDate" +'%s')";
                DiffDays="$(( ( EndDateSec - TodayDateSec )/86400 ))"
                echo "***********$DiffDays************"
                if [[ "$DiffDays" -lt 30 ]]; then
                        echo "Certificate is going to expire in $DiffDays. Please take required action"
                fi
        fi
done < sample3.csv

date使用中のコマンド(または使用中のロケール)と互換性のない日付形式を使用している場合は、次の方法を試すことができdateますbusybox

$ busybox date -D '%a %b %d %T %Z %Y' -d 'Thu Aug 18 18:59:59 EST 2022' +'%s'

1660863599

おすすめ記事