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
答え2
シェルループを使用してテキストを処理するのはアンチパターンです。シェルループを使用してテキストを処理するのはなぜ悪い習慣と見なされますか?、GNU awk時間関数を使用してスクリプトが実行する作業をより効率的に実行する方法は次のとおりです。
$ cat tst.sh
#!/usr/bin/env bash
awk '
BEGIN {
FS=","
secsInDay = 60 * 60 * 24
curDate = strftime("%Y %m %d")
secs = mktime(today " 12 0 0")
today = int( systime() / secsInDay )
}
NR == 1 {
next
}
$3 == "" {
printf "EndDate details not exists\n"
next
}
{
printf "Name: %s; StartDate: %s; EndDate: %s\n", $1, $2, $3
split($3,d," ")
mthNr = (index("JanFebMarAprMayJunJulAugSepOctNocDec",d[2])+2)/3
secs = mktime(d[6] " " mthNr " " d[3] " 12 0 0")
endDay = int( secs / secsInDay )
diffDays = endDay - today
printf "***********%d************\n", diffDays
}
diffDays < 30 {
printf "Certificate is going to expire in %d days. Please take required action\n", diffDays
}
' "${@:--}"
これは既存のスクリプトが実行する作業を実行するより良い方法ですが、このような出力を生成するスクリプトは全体的な作業のための良い開始点ではありませんif certificate expires in 30 days need to send an notification email.
。この質問に対する回答を受け入れた後にこれを行う方法については、新しい質問をしてください。