Ответы:
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 $?после запуска этой команды, чтобы увидеть ее код возврата - вот что важно с ней