Antworten:
0 8 * * 6 test $((10#$(date +\%W)\%2)) -eq 1 && yourCommand
date +%W
: Woche Nummer des Jahres mit Montag als erstem Wochentag, heute Woche 39
10#$(date +%W)
: Konvertieren Sie die date +W
Dezimalzahl und vermeiden Sie Verwirrung beim Parsen der Shell-Basis
$((39%2))
: modulo operation: Ergebnis ist 0 (gerade Wochennummer) oder 1 (ungerade Wochennummer), dieses Wochenergebnis ist 1, nächste Woche 0
test 1 -eq 1
: arithmetischer Test (gleich), in diesem Fall ist das Ergebnis boolean true
&& yourCommand
: Boolean AND: yourCommand
Nur ausführen , wenn das Ergebnis des vorherigen Befehls boolean true war
Beachten Sie, dass das Jahr zwei ungerade Wochen haben kann: 53 (dieses Jahr) und 1 (nächstes Jahr)
0 8 * * 6 test $(($(date +\%W)\%2)) -eq 1 && yourCommand
$((10#$(date +%W)%2)) -eq 1 && echo OK
meine Shell auszuführen , versucht ich, das Ergebnis der Wochenberechnung auszuführen : -bash: 1: command not found
. Irgendein Hinweis, warum es das tut? Vielen Dank.
test
ist kein Benutzer, es ist ein Befehl. Versuchen Sie:test $((10#$(date +\%W)%2)) -eq 1 && echo odd || echo even
Was Sie gezeigt haben, ist "jede Woche". Dann lautet der Code:
0 8 * * 6
Sind Sie sicher, dass Sie es alle zwei Wochen ausführen müssen?
0 8 * * 6 expr `date +\%s` / 604800 \% 2 >/dev/null || yourCommand
echo $?
nachdem Sie diesen Befehl ausgeführt haben, um seinen Rückkehrcode zu sehen - das ist wichtig