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:
DAYOFWEEK=$(date +"%a")
echo DAYOFWEEK: $DAYOFWEEK
if ["$DAYOFWEEK" == "Thu"];
then
echo YES
else
echo NO
fi
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?
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
.
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="$(...)"
).
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
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