У меня возникают проблемы с пониманием того, как правильно проверить из сценария bash текущее время между 23:00 и 06:30. Я пытаюсь запустить бесконечный цикл, чтобы проверить время и что-то сделать, если интервал времени между 11 вечера и 6:30 утра. Вот что я написал до сих пор, что не работает на следующий день:
fireup()
{
local starttime=$(date --date="23:00" +"%s")
local endtime=$(date --date="06:30" +"%s")
while :; do
local currenttime=$(date +%s)
if [ "$currenttime" -ge "$starttime" -a "$currenttime" -ge "$endtime" ]; then
do_something
else
do_something_else
fi
test "$?" -gt 128 && break
local currenttime=$(date +%s)
done &
}
Что я делаю не так?
Ответы:
Если все, что вам нужно, это проверить, если
HH:MM
между 23:00 и 06:30, то не используйте метки времени Unix. Просто проверьтеHH:MM
значения напрямую:Ноты:
HH:MM
будет в лексикографическом порядке, поэтому вы можете напрямую сравнивать их как строки.-a
или-o
в[ ]
, используйте||
и&&
вместо этого.[[ ]]
более[ ]
, это облегчает жизнь.источник
date
использовать определенный часовой пояс, используяTZ
переменную (например,TZ=Asia/Tokyo date
илиTZ=UTC date +%H:%M
Если вы хотите быть более точным в отношении времени, которое вы хотите сопоставить, вы можете использовать
case
утверждение. Вот 24-часовой цикл с оператором case, который указывает, соответствует ли текущее время вашему диапазону:Чтобы использовать его в вашем скрипте, просто замените переменные вызовом
date
:Вы можете подумать о том, чтобы быть более дружественным к вашему ЦП и вычислять промежуток времени между (сейчас) и временем следующего запуска, и в
sleep
течение этого промежутка времени.источник
Вы можете преобразовать время в секунды с начала «этого» дня, а затем проверить, что значение секунд больше
23*60*60
(82800) или меньше6*60*60+30*60
(23400).Чтобы получить секунды с начала «этого» дня, вы можете сделать:
И тест будет:
источник
У меня похожая ситуация. Моя цель - найти решение, которое очень просто поддерживать не-юниксам.
Когда мой сервер Linux перезагружается, он запускает скрипт, который отправляет предупреждение. Но если это происходит как часть нашего «Окна обслуживания», которое определяется как между 23:00 субботы и 6:00 воскресенья, я не хочу отправлять страницу, потому что перезапуск в этом окне - «Хорошо» (исправления применены и т. Д.). Я проверил его, и он работает как задумано (насколько я могу судить).
Вот календарь для справки:
Вот мой тестовый код:
Вот вывод
источник
В этом конкретном случае альтернативой, упрощающей тестирование, является добавление часа и тестирование один раз для менее чем
07:30
источник
Подсказка: ответ Муру выше работал для меня, но вместо || (трубы, "или"), я должен был использовать && ("и" оператор).
например: if [["$ currenttime"> "23:00"]] && [["$ currenttime" <"06:30"]]
источник