Хороший метод порівняння часу?


10

Мені потрібно перевірити поточний час і скасувати сценарій, якщо це не належний час доби, я повинен запустити його. Крім того, якщо хтось інший керує ним, він повинен абортувати.

Наприклад: мені потрібен мій сценарій, якщо він запускається між 22:00 та 2:00 (вікно 4 години).

В даний час я роблю наступне. Витрата часу date +%k%Mта порівняння з твердими кодованими номерами

#!/bin/sh
currTime=`date +%k%M`
check_time_to_run()
{
    tempTime=$1
    if [ $tempTime -gt 200 -a $tempTime -lt 2200 ]; then 
        echo "Time is between 2 AM and 10 PM. Aborting."
        exit 1
    else
        echo "Time is after 10 PM and before 2 AM. Running normally."
    fi
}

check_time_to_run $currentTime

Мені хотілося б знати, чи існує якийсь інший ефективний метод щодо порівняння часу у shчи bash?


1
Якщо вам потрібно порівняти дві дати спробувати перетворити їх в MJD або UNIX час, наприклад: date +%s.
Eddy_Em

1
@Eddy ні, це не дата, це час, який мені потрібно порівняти.
mtk

1
Я думаю, за лічені секунди було б краще: currTime=$(date +%s); lower=$(date +%s --date="2:00"); upper=$(date +%s --date="22:00"); if [$currTime -gt $lower -a $currTime -lt $upper]; then
Eddy_Em

чому б не поставити сценарій у crontab? таким чином ви гарантуєте, що він працює в цей конкретний час
BitsOfNix

1
Оскільки будь-який користувач може змінити час на процес faketime, ваш сценарій не дуже безпечний. Використання замкових файлів, мабуть, кращий варіант.
jofel

Відповіді:


6

Це виглядає ідеально для мене. Що ви думаєте, що це слід вдосконалювати?

У будь-якому випадку, шляхи її вдосконалення можуть бути:

  • Використовуйте менший, швидший оболонку, ніж bash, як тире або pdksh.
  • використовувати оболонку, яка має вбудовані можливості дати, як zshабоksh93
  • використання gawk(яке менше, ніж bash, але не тире, але може уникнути зайвої вилки):

Приклад:

#! /usr/bin/gawk -f
BEGIN {now = strftime("%k%M")+0; exit(now > 200 && now < 2200)}

ОК здорово. Просто хотів підтвердити, що те, що я роблю, не є грубим чи злим. Дякуємо за пропозиції.
mtk

4

Якщо дозволені зовнішні інструменти, можливо, ви захочете перевірити dateutils.

Ваш "сценарій" стає:

if dtest time --gt '02:00:00' && dtest time --lt '22:00:00'; then
    echo "Time is between 2 AM and 10 PM. Aborting."
fi

Відмова: Я є автором зазначеного інструменту.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.