Выполнение crontab-подобного числового соответствия в сценарии оболочки - PullRequest
2 голосов
/ 04 марта 2011

Какой самый простой способ эмулировать такое же числовое соответствие, которое используется для выражений в первых пяти полях строки crontab?

Например, заданные входные данные шаблона "1,5-7,16, * / 3 "(глупый пример, я знаю) и значение" 6 ", на выходе будет логическое значение true.

Если не существует мертвого простого решения, оно будетбыть реалистичным в моей ситуации, чтобы предоставить третий вход, который определил бы максимальное значение, которому звездочка должна соответствовать, чтобы звездочки (вместе с дефисными диапазонами) могли быть переведены в список значений, и входное значение могло быть сопоставлено сэтот список.(Список приведенного выше примера шаблона будет «1,3,5,6,7,9,12,15,16,18» при максимальном значении «18».)

Спасибо!

1 Ответ

2 голосов
/ 05 марта 2011

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

hrVal=6
case ${hrVal} in   
   1|[5-7]|16 ) print -- "true" ;;
   * ) print -- "false" ;;
esac

Изменить 2018-08-20 Для bash вам нужно изменить print -- на echo .... или printf "%s\n".

На самом деле, я бы удалил материал print -- ""и просто вызовите exit 0 или exit 1, который затем завершится с соответствующим кодом возврата, который затем можно будет проверить вызывающим процессом.


, чтобы включить остальную часть вашего примера, япришлось сделать

  hrVal=6
  eval "
    case ${hrVal} in

      1|[5-7]|16|$(( ${hrVal} / 3 )) ) print -- "true" ;;
      * ) print -- "false" ;;
    esac
 "

Итак, это может быть захватывающе!

  • Разобрать каждый из 5 временных диапазонов, как указано выше
  • применить команды sed like для преобразования записейкак 1,5-7,16 в 1 | [5-7] | 16
  • перехватывать и конвертировать ваши математические выражения в вычислимые выражения (о, вы, вероятно, можете получить результат перед оператором case и просто объединитьзначение в ....) сохраните все производные значения как переменные,
  • используйте эти переменные в качестве целевых значений, возможноe оборачивая все это и избегая символов по мере необходимости с помощью eval.
  • оценивает объединенную правду всех возвращаемых значений 5 столбцов (любое ложное == ложное)

(возможно, это(($ {hrVal} / 3)) в bash)

IHTH

...