日付をaからbに増やす方法は?

日付をaからbに増やす方法は?

start=201909032つの日付があり、end=20210912 開始がほぼ終わるまで増分したいと思います。増分は13日です。

次のコードがありますが、終わりを超えています。

#! /usr/bin/env bash

start="20190903"
end="20210912"

startdate="$(date -d ${start} +'%Y-%m-%d')"
enddate="$(date -d ${end} +'%Y-%m-%d')"
echo ${startdate}
echo ${enddate}

while [ "${startdate}" < "${enddate}" ]; do
    echo ${startdate}
    startdate="$( date -d "${startdate} + 13 days" +'%Y-%m-%d')"
done

答え1

startdate+interval先端と比較すると、オーバーライドを防ぐことができます。

#!/bin/bash

start="20190903"
end="20210912"
interval=1123200
    # 13 days = 13 * 24 * 60 *60

startdate=$( date --utc -d ${start} +%s )
enddate=$( date --utc -d ${end} +%s )

echo "$( date --utc -d @${startdate} +"%Y-%m-%d" ) (start)"
next=${startdate}
while [[ "$(( next+interval ))" -lt "${enddate}" ]] ; do
    next=$(( next+interval ))
    nextdate=$( date --utc -d @${next} +"%Y-%m-%d" )
    echo "${nextdate}"
done
echo "$( date --utc -d @${enddate} +"%Y-%m-%d" ) (end)"

13日をどのように追加したのか分からないので、1970-01-01から秒に変更しました。少なくとも今、あなたは他の方法を知っています。

答え2

Billy 叔父さんの説明を拡張するのは[一般的なコマンドなので、<標準入力リダイレクトを使用しています。エラーが発生しない場合は、以前にbash: line 9: 2021-09-12: No such file or directory使用していた可能性があります>

[ "${startdate}" < "${enddate}" ]

評価結果と

[ "${startdate}" ]

設定されていないか空でない限りTrue $startdate。したがって、無限ループが発生します。

[[次のように使用するように変更

while [[ "${startdate}" < "${enddate}" ]]; do

これは通常のコマンドではなく、独自の構文を持つ特殊な形式であり、/<>リダイレクトとして解析されないため、この問題を修正しました。

編集者:[[一種の打楽器です。 POSIXと互換性があるようにするには、を[使用できます-lt。ただし、辞書とは異なり、数値比較を実行するため、日付形式からsを削除する<必要があります。-

#!/bin/sh

startdate="20190903"
enddate="20210912"

echo ${startdate}
echo ${enddate}

while [ "${startdate}" -lt "${enddate}" ]; do
    echo ${startdate}
    startdate="$( date -d "${startdate} + 13 days" +'%Y%m%d')"
done

startあなたの場合、このような変更はもはやそれと同じものを必要としないので、より少ないコードで終わります。startdateendenddate

編集2:別のオプションはescapingのようですが、<これは[ "${startdate}" \< "${enddate}" ]bashでのみ機能するようです。 POSIXではなく、少なくともzshでは失敗します。

関連情報