web-dev-qa-db-fra.com

Comment vérifier si aujourd'hui est un week-end à bash?

Comment vérifier si aujourd'hui est un week-end en utilisant bash ou même perl?

Je souhaite empêcher certains programmes de s'exécuter un week-end.

36
vehomzzz

Vous pouvez utiliser:

pax> if [[ $(date +%u) -gt 5 ]] ; then
   > echo weekend
   > fi

date +%u vous donne le jour de la semaine du lundi (1) au dimanche (7). S'il est supérieur à 5 (samedi = 6 ou dimanche = 7), alors c'est le week-end.

Vous pouvez donc mettre quelque chose comme ça en haut de votre script:

if [[ $(date +%u) -gt 5 ]] ; then
    echo 'Sorry, you cannot run this program today.'
    exit
fi

Pour vérifier s'il s'agit d'un jour de semaine, utilisez:

if [[ $(date +%u) -lt 6 ]] ; then
72
paxdiablo
case "$(date +%a)" in 
  Sat|Sun) echo "weekend";;
esac
15
ghostdog74

C'est en fait un problème étonnamment difficile, car qui veut dire que "week-end" signifie samedi et dimanche ... ce qui constitue "le week-end" peut en fait varier selon les cultures (par exemple en Israël, les gens travaillent le dimanche et ont le vendredi). Bien que vous puissiez obtenir la date avec la commande date, vous devrez stocker des données supplémentaires indiquant ce qui constitue le week-end pour chaque paramètre régional si vous souhaitez l'implémenter d'une manière qui fonctionne pour tous les utilisateurs. Si vous ne ciblez qu'un seul pays, la solution proposée dans les autres réponses fonctionnera ... mais il est toujours bon de garder à l'esprit les hypothèses formulées ici.

7

Utilisez l'opérateur localtime de Perl.

heure locale

Convertit une heure renvoyée par la fonction heure en une liste de 9 éléments avec l'heure analysée pour le fuseau horaire local. Généralement utilisé comme suit:

#  0    1    2     3     4    5     6     7     8
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);

$wday est le jour de la semaine, 0 indiquant dimanche et 3 indiquant mercredi.

Par exemple:

$ date 
 dim. août 15 20:27:29 CDT 2010 
 
 $ Perl -le 'my $ wday = (heure locale) [6]; 
 print $ wday> = 1 && $ wday <= 5? "en semaine": "week-end" '
 week-end
5
Greg Bacon

J'aime cette façon d'exécuter des programmes en semaine:

[[ $(date +%u) -lt 6 ]] && weekday-program

C'est une construction un peu délicate, mais compacte et facile à ajouter.

0
Eugene Ionichev

Je ne sais pas vraiment si cela convient à cette question, mais je voulais le partager pour aider les autres et c'est la question de Stack la plus proche de ce que je cherchais.

Il s'agit d'un script Shell que j'utilise pour démarrer une application lorsque je démarre mon ordinateur, l'application ne peut pas se connecter à son serveur pendant le week-end (son arrêt pour maintenance car le service ne fonctionne pas le week-end (application de trading forex).

Informations sur ce script, d est de 1 à 7 (du lundi au dimanche) h est de 24 fois. Vous pouvez ajuster cela à vos propres paramètres, peut-être avez-vous une maintenance en milieu de semaine ou toute autre cause. Ceci est mon tout premier script Shell, donc je suis sûr qu'il y a une meilleure façon et si quelqu'un veut apporter des modifications, n'hésitez pas à examiner pour acceptation (ou quelqu'un d'autre peut le faire)

#!/bin/bash
d=$(date +%u)
h=$(date +%H)
case $d in
    '5')
    # Friday after 10pm
    if (($h >= 22)) ; then  
        exit
    fi
    ;;
    '6')
    # all day saturday
        exit
    ;;
    '7')
    #sunday before 10pm
    if (($h < 22)) ; then  
        exit
    fi
    ;;
    *)
    # any other time run the program

    ;;
esac
0
Chris

printf a aussi une date

printf -v day '%(%a)T'
case $day in 
    Sat|Sun) echo "Hooray!";;
esac

https://ideone.com/wU7C0c - démo

0
Ivan