Ответы:
0 8 * * 6 test $((10#$(date +\%W)\%2)) -eq 1 && yourCommand
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 (в следующем году)
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
То, что вы показали, это «каждую неделю». Тогда код:
0 8 * * 6
Вы уверены, что вам нужно запускать его каждые две недели?
0 8 * * 6 expr `date +\%s` / 604800 \% 2 >/dev/null || yourCommand
echo $?
после запуска этой команды, чтобы увидеть ее код возврата - вот что важно с ней