как увеличить дату от a до b?

Вам не нужно об этом беспокоиться, потому что gzipсоздает новый .gzфайл, заполняет его сжатым содержимым, а затем удаляет исходный файл. Поэтому, если вы остановите процесс в середине, это не повлияет на исходный файл.

2
03.10.2021, 10:16
2 ответа

В дополнение к комментариям дяди Билли, [— это обычная команда, поэтому вы используете <как стандартное перенаправление ввода. Если вы не получили ошибку bash: line 9: 2021-09-12: No such file or directory, вполне вероятно, что вы создали этот файл с предыдущим использованием >. Если это так, то

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

оценивается так же, как

[ "${startdate}" ]

, что верно до тех пор, пока $startdateне сброшено или не пусто. Итак, у вас есть бесконечный цикл.

Переход на использование [[как в

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

исправляет это, потому что это специальная форма с собственным синтаксисом вместо обычной команды, а </ >не анализируются как перенаправления.

РЕДАКТИРОВАТЬ:[[— это баш -изм.Если вы хотите, чтобы это работало с [, чтобы оно было совместимо с POSIX -, вы можете использовать -lt. Однако, поскольку это делает числовое сравнение вместо лексикографического, как <, вам придется удалить -из вашего формата даты:

#!/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в startdateи то же самое с end/enddate.

РЕДАКТИРОВАТЬ 2 :Другой вариант, по-видимому, состоит в том, чтобы экранировать <, как в [ "${startdate}" \< "${enddate}" ], но, похоже, это работает только для bash. Это не POSIX, и он не работает, по крайней мере, на zsh.

3
03.10.2021, 19:05

Сравнивая 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. По крайней мере, теперь вы знаете другой способ сделать это.

5
03.10.2021, 10:39

Теги

Похожие вопросы