日付がn年になっていることを確認してください。

日付がn年になっていることを確認してください。

yyyy-mm-dd形式の$date変数がありますが、正確に1年、2年などであることを確認したいと思います。

これが私が今まで試したことです:

dates=$(echo $date | cut -c6-10)
todays=$(date +"%m-%d")
if [ $todays == $dates ]; then
        echo "$path;$date;$time;$gps" >>$databasematch
else
        :
fi

答え1

変数を想定し、$today今日の$date日付と確認したい日付をそれぞれ保持します。

日付を2番目の解像度に変換する必要はなく、比較の日付から何も減算または追加する必要はありません。また、GNUの日付は今日の日付を知ることができるので($today削除することができます)、引用は少し混乱します。

以下は、1年前のバージョンであることを確認する方法です$then_date(私のシステムではGNU日付と呼ばれますgdate)。

then_date="2019-09-17"

if [[ $( gdate -d "now -1 year" +"%Y-%m-%d" ) == "$then_date" ]]; then
    echo "YES"
else
    echo "NO"
fi

日付間の年数が必要な場合は、まず年なしで日付を比較してから年差を出力します。

if [[ $( gdate +"%m%d" ) == $( gdate -d "$then_date" +"%m%d" ) ]]; then
    now_year=$( gdate +"%Y" )
    then_year=$( gdate -d "$then_date" +"%Y" )

    printf "'%s' is today, but %d years ago\n" \
        "$then_date" "$(( now_year - then_year ))"

else
    echo "Not same day"
fi

編集する:問題が変更されました。今より良い方法があるかどうか尋ねます。

dates=$(echo $date | cut -c6-10)
todays=$(date +"%m-%d")
if [ $todays == $dates ]; then
        echo "$path;$date;$time;$gps" >>$databasematch
else
        :
fi

ここで:

now_day=$( gdate +"%m%d" )

echo "$date" | 
while read then_date; do
    then_day=$( gdate -d "$then_date" +"%m%d" )
    if [[ "$now_day" == "$then_day" ]]; then
        echo "$path;$date;$time;$gps"
    fi
done >$databasematch

echo "$date"これにより、そのビットを日付を生成する項目に置き換える必要がある場合に、変数で大量のデータを読み取ることを防ぐことができます。

関連情報