web-dev-qa-db-fra.com

Comment utiliser une requête If-sinon basée sur la journée de la semaine?

Problème: J'ai besoin de vérifier si aujourd'hui est jeudi et effectuez différentes actions en fonction du résultat de cette condition. J'ai essayé deux approches différentes:

Obtenir le nom de la journée:

DAYOFWEEK=$(date +"%a")
echo DAYOFWEEK: $DAYOFWEEK
if ["$DAYOFWEEK" == "Thu"]; 
then   
   echo YES
else
    echo NO
fi

Obtenir le jour num:

DAYOFWEEK=$(date +"%u")
echo DAYOFWEEK: $DAYOFWEEK

if ["$DAYOFWEEK" == 4]; 
then
   echo YES
else
   echo NO
fi

Dans les deux cas, la sortie est non, même si elle devrait être oui. Qu'est-ce qui ne va pas?

10
Swagatika

Le problème est le vide manquant.

Le code suivant fonctionnera dans les coquilles dont [ la commande intégrée accepte == comme un alias pour =:

if [ "$DAYOFWEEK" == 4 ];  then    echo YES; else    echo NO; fi

Mais gardez à l'esprit (voir help test dans bash):

  • == n'est pas mentionné officiellement, vous devriez utiliser = pour la chaîne Comparer
  • -eq est destiné aux tests arithmétiques décimaux (ne fera pas la différence ici pour date +%u mais pour date +%d Par exemple, quand il s'agit de comparer 04 et 4 qui sont numériquement les mêmes mais lexiquement différents).

Je préférerais:

 if [ "${DAYOFWEEK}" -eq 4 ];  then    echo YES; else    echo NO; fi

Généralement, vous devriez préférer l'approche de jour numéro, car elle a moins de dépendance au courant locale. Sur mon système la sortie de date +"%a" est aujourd'hui Do.

12
H.-Dirk Schmitt

Ne négligez pas case qui est souvent un meilleur moyen de faire ce genre de choses:

Aussi se méfier que la sortie de date +%a est dépendante des paramètres régionaux, donc si vous attendez des noms d'anglais, votre script cessera de travailler lorsqu'il est invoqué par un utilisateur français ou coréen par exemple.

case $(LC_ALL=C date +%a) in
   (Mon) echo first day of the week;;
   (Thu) do-something;;
   (Sat|Sun) echo week-end;;
   (*) echo any other day;; # last ;; not necessary but doesn't harm
esac

Notez que ci-dessus est l'un des rares cas où $(...) n'a pas besoin d'être cité (bien que des citations ne soient pas atteintes. Identique que dans var="$(...)").

3
Stéphane Chazelas

Dans la même idée, j'utilise la pièce de code suivante pour "désactiver" un cron avant une heure choisie
[.____] Bien sûr, je préférerais modifier le crontab lui-même ... Si j'avais obtenu les droits nécessaires à:)

Voici un test simple qui aborde un script Bash à moins que nous soyons la nuit.

# Delay or restrict execution.
# Here, we quit unless hour is greater than (gt) 2 and (-a) lower than (lt) 7
# i.e. execution happens only at 3,4,5&6 o'clock.
if  /usr/bin/test `date '+%H'` -gt 2 -a `date '+%H'` -lt 7; then
  echo LETS_START_PROCESSING;
else
  exit;
fi

#Put job here
0
Balmipour

Pour arrêter le script le jour de la semaine, supprimez uniquement la ligne de la journée:

DAYOFWEEK=$(date +"%u")
echo "$DAYOFWEEK";
if [ "$DAYOFWEEK" == 1 ]; then exit; else echo; fi
if [ "$DAYOFWEEK" == 2 ]; then exit; else echo; fi
if [ "$DAYOFWEEK" == 3 ]; then exit; else echo; fi
if [ "$DAYOFWEEK" == 4 ]; then exit; else echo; fi
if [ "$DAYOFWEEK" == 5 ]; then exit; else echo; fi
if [ "$DAYOFWEEK" == 6 ]; then exit; else echo; fi
if [ "$DAYOFWEEK" == 7 ]; then exit; else echo; fi
0