date +%W: numéro de semaine de l'année avec lundi comme premier jour de la semaine, aujourd'hui semaine 39
10#$(date +%W): convertir le date +Wnombre décimal et éviter la confusion d'analyse de la base du shell
$((39%2)): opération modulo: le résultat est 0 (numéro de semaine pair) ou 1 (numéro de semaine impair), le résultat de cette semaine est 1, la semaine prochaine 0
test 1 -eq 1: test arithmétique (égal), dans ce cas le résultat est booléen vrai
&& yourCommand: Boolean AND: exécuté yourCommanduniquement si le résultat de la commande précédente était booléen true
Notez que l'année peut avoir deux semaines impaires: 53 (cette année) et 1 (l'année prochaine)
C'est élégant! Il a encore, comme vous l'avez noté, un cas d'angle le 53e samedi de l'année, qui se produira environ soixante-dix ans tous les quatre siècles.
MadHatter
@Cyrus merci pour votre réponse, mais si j'écris * * * * 5 test $ (($ (date +% W)% 2)) -eq 1 && /u02/restore/scripts/test.sh le script ne fonctionne pas exécuter mais si j'écris * * * * 5 /u02/restore/scripts/test.sh s'exécute. pourquoi votre expression ne fonctionne-t-elle pas? Je testais simplement les cas et j'ai constaté que cela ne fonctionnait pas.
kupa
1
Mon erreur. Cron interprète% comme une nouvelle ligne. Échapper aux deux% avec un \ dans votre cronjob:0 8 * * 6 test $(($(date +\%W)\%2)) -eq 1 && yourCommand
Cyrus
Désolé pour ramener cette vieille question , mais il ne fonctionnait pas pour moi et quand je tente d'exécuter $((10#$(date +%W)%2)) -eq 1 && echo OKmes shell tente d'exécuter le résultat du calcul de la semaine: -bash: 1: command not found. Un indice pourquoi il fait ça? Merci.
2017
3
@jhuet: testn'est pas un utilisateur c'est une commande. Essayez:test $((10#$(date +\%W)%2)) -eq 1 && echo odd || echo even
Cyrus
4
Ce que vous avez montré, c'est "chaque semaine". Alors le code est:
0 8 * * 6
Êtes-vous sûr de devoir l'exécuter toutes les deux semaines?
Pouvez-vous expliquer la commande, s'il vous plaît
kupa
1
Il vaut mieux utiliser ce que Cyrus a donné - $ (($ (date +% W)% 2)) "W" représente un numéro de semaine de l'année. De zéro à 53. Si elle peut être divisée par deux, alors c'est votre semaine "toutes les secondes". Donc cronjob s'exécute chaque semaine, mais l'exprime n'exécute la commande yourCommand que si le numéro de la semaine peut être divisé par 2.
Glueon
lorsque j'exécute le test $ (($ (date +% W)% 2)) -eq 1 sur la ligne de commande ne renvoie rien, pourquoi?
kupa
1
il suffit de lancer echo $?après avoir exécuté cette commande, pour voir son code de retour - c'est ce qui est important avec elle
0 8 * * 6 test $(($(date +\%W)\%2)) -eq 1 && yourCommand
$((10#$(date +%W)%2)) -eq 1 && echo OK
mes shell tente d'exécuter le résultat du calcul de la semaine:-bash: 1: command not found
. Un indice pourquoi il fait ça? Merci.test
n'est pas un utilisateur c'est une commande. Essayez:test $((10#$(date +\%W)%2)) -eq 1 && echo odd || echo even
Ce que vous avez montré, c'est "chaque semaine". Alors le code est:
Êtes-vous sûr de devoir l'exécuter toutes les deux semaines?
la source
echo $?
après avoir exécuté cette commande, pour voir son code de retour - c'est ce qui est important avec elle