Если вы хотите циклически повторять набор дат, вы не должны рассматривать их как целые числа, а как фактические даты.Даже если ваша строка даты имеет формат YYYYMMDD
и выглядит как число, она не выполняет те же операции, что и число.Как вы указываете, у вас возникают проблемы, когда вы хотите увеличить дополнительный день, когда вы находитесь в последний день месяца или, что еще хуже, в последний день года:
20190131 -> 20190201
20190228 -> 20190301
20190430 -> 20190501
20193112 -> 20200101
Но все становитсядействительно раздражает, когда вы учитываете високосные годы:
20190228 -> 20190301
20200228 -> 20200229
Таким образом, вы можете настроить сложную систему, которая отслеживает все эти вещи, такие как:
days_in_month=(x 31 28 31 30 31 30 31 31 30 31 30 31)
day=20180101
while (( day < 20181231 )); do
# start with incrementing day:
yyyy=${day:0:4}; mm=${day:4:2}; dd=${day:6:2}
if (( dd < ${days_in_month[$mm]} )); then
(( day++ ))
elif (( mm == 2 && (yyyy%400 == 0 || (yyyy%100 != 0 && yyyy%4 == 0)) )); then
(( day++ ))
elif (( mm < 12 )); then
dd="01"; (( mm++ )); day="${yyyy}${mm}01"
else
(( yyyy++ )); day="${yyyy}0101"
fi
# do your stuff
done
или вы можетепросто будь проще:
day=20180101
while (( day < 20181231 )); do
# start with incrementing day:
tmp=${day:0:4}-${day:4:2}-${day:6:2}
day=$(date -d "$tmp + 1 day" "+%F")
# do your stuff
done