date +%W: номер недели в году с понедельником в качестве первого дня недели, сегодня неделя 39
10#$(date +%W): преобразовать в date +Wдесятичное число и избежать путаницы при разборе базы
$((39%2)): операция по модулю: результат равен 0 (четный номер недели) или 1 (нечетный номер недели), результат этой недели равен 1, следующая неделя 0
test 1 -eq 1: арифметический тест (равный), в этом случае результат является логическим значением true
&& yourCommand: Boolean AND: запускать yourCommandтолько в том случае, если результат предыдущей команды был логическим значением true
Обратите внимание, что год может получить две нечетные недели: 53 (в этом году) и 1 (в следующем году)
Это элегантно! У него все еще, как вы отметили, есть угловой случай в 53-ю субботу года, которая случится примерно через семьдесят лет через каждые четыре столетия.
MadHatter
@Cyrus спасибо за ваш ответ, но если я напишу * * * * 5 test $ (($ (date +% W)% 2)) -eq 1 && /u02/restore/scripts/test.sh, сценарий не запустить, но если я напишу * * * * 5 /u02/restore/scripts/test.sh скрипт запускается. почему ваше выражение не работает? Я просто проверял дела. И обнаружил, что не работает как-то.
Купа
1
Виноват. Крон интерпретирует% как перевод строки. Побегите оба% с помощью \ в вашем cronjob:0 8 * * 6 test $(($(date +\%W)\%2)) -eq 1 && yourCommand
Cyrus
К сожалению , чтобы вернуть этот старый вопрос , но он не работает для меня , и когда я пытаюсь выполнить $((10#$(date +%W)%2)) -eq 1 && echo OKмои оболочки пытаются выполнить результат вычисления недели: -bash: 1: command not found. Любая подсказка, почему он это делает? Спасибо.
jhuet
3
@jhuet: testэто не пользователь, это команда. Попробуйте:test $((10#$(date +\%W)%2)) -eq 1 && echo odd || echo even
Cyrus
4
То, что вы показали, это «каждую неделю». Тогда код:
0 8 * * 6
Вы уверены, что вам нужно запускать его каждые две недели?
Лучше использовать то, что дал Сайрус - $ (($ (дата +% W)% 2)) "W" обозначает номер недели в году. Начиная с нуля до 53. Если это можно разделить на два, то это ваша "каждая вторая" неделя. Таким образом, cronjob запускается каждую неделю, но «expr» выполняет команду yourCommand, только если номер недели можно разделить на 2.
Glueon
когда я запускаю test $ (($ (date +% W)% 2)) -eq 1 в командной строке, ничего не возвращается, почему?
Купа
1
просто запустите echo $?после запуска этой команды, чтобы увидеть ее код возврата - вот что важно с ней
0 8 * * 6 test $(($(date +\%W)\%2)) -eq 1 && yourCommand
$((10#$(date +%W)%2)) -eq 1 && echo OK
мои оболочки пытаются выполнить результат вычисления недели:-bash: 1: command not found
. Любая подсказка, почему он это делает? Спасибо.test
это не пользователь, это команда. Попробуйте:test $((10#$(date +\%W)%2)) -eq 1 && echo odd || echo even
То, что вы показали, это «каждую неделю». Тогда код:
Вы уверены, что вам нужно запускать его каждые две недели?
источник
echo $?
после запуска этой команды, чтобы увидеть ее код возврата - вот что важно с ней