Как проверить, находится ли текущее время между 23:00 и 06:30

Прошу прощения, если это похоже на домашнюю работу, но мне трудно понять, как правильно проверить скрипт bash, если текущее время находится между 23:00 и 06:30. Я пытаюсь запустить бесконечный цикл, чтобы проверить время сейчас, и что-то делать, если диапазон времени находится между 11:00 и 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 напрямую:

 fireup() { while :; do currenttime=$(date +%H:%M) if [[ "$currenttime" > "23:00" ]] || [[ "$currenttime" < "06:30" ]]; then do_something else do_something_else fi test "$?" -gt 128 && break done & } 

Заметки:

  • Время в HH:MM будет в лексикографическом порядке, поэтому вы можете напрямую сравнить их как строки.
  • Избегайте использования -a или -o в [ ] , используйте || и && вместо этого.
  • Поскольку это bash, предпочитайте [[ ]] над [ ] , это облегчает жизнь.

Если вы хотите более четко указать время, которое вы хотите сопоставить, вы можете использовать оператор case . Вот 24-часовой цикл с аргументом case внутри, который указывает, соответствует ли текущее время вашему диапазону:

 for hh in {00..23} do for mm in {00..59} do case $hh:$mm in (23:*) echo YES $hh:$mm;; (0[012345]:*) echo YES $hh:$mm;; (06:[012]*) echo YES $hh:$mm;; (*) echo NO $hh:$mm;; esac done done 

Чтобы использовать его в своем скрипте, просто замените переменные на вызов:

 case $(date +%H:%M) in (23:*) echo YES;; (0[012345]:*) echo YES;; (06:[012]*) echo YES;; (*) echo NO;; esac 

Вы можете подумать о том, чтобы быть более дружелюбным к вашему процессору и вычислять промежуток времени между (сейчас) и следующим временем запуска и sleep течение этого времени.