두 날짜 사이의 일수를 얻으려고 하는데 인증서가 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.
. 이 질문에 대한 답변을 수락한 후 이를 수행하는 방법에 대한 도움을 받으려면 새로운 질문을 하십시오.