Вам не нужно об этом беспокоиться, потому что gzip
создает новый .gz
файл, заполняет его сжатым содержимым, а затем удаляет исходный файл. Поэтому, если вы остановите процесс в середине, это не повлияет на исходный файл.
В дополнение к комментариям дяди Билли, [
— это обычная команда, поэтому вы используете <
как стандартное перенаправление ввода. Если вы не получили ошибку 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.
Сравнивая 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. По крайней мере, теперь вы знаете другой способ сделать это.