J'utilise le script ci-dessous pour reculer de deux jours lorsque le script s'exécute au début de deux jours de l'année et également vérifier les premier et deuxième jours de chaque mois et reculer de deux jours.
if [$month="01"] && [$day="01"];
then
date="$last_month/$yes_day/$last_year"
fulldate="$last_month/$yes_day/$last_year"
else
if [$month="01"] && [$day="02"];
then
date="$last_month/$yes_day/$last_year"
fulldate="$last_month/$yes_day/$last_year"
else
if [ $day = "01" ];
then
date="$last_month/$yes_day/$year"
fulldate="$year$last_month$yes_day"
else
if [ $day = "02" ];
then
date="$last_month/$yes_day/$year"
fulldate="$year$last_month$yes_day"
else
date="$month/$yes_day/$year"
fulldate="$year$month$yes_day"
fi
fi
fi
fi
Mais mon mauvais reçois le message d'erreur ci-dessous
Etime_script.sh: line 19: [06=01]: command not found
Etime_script.sh: line 24: [06=01]: command not found
Réponse acceptée :
[
n'est ni un métacaractère ni un opérateur de contrôle (pas même un mot réservé ; idem pour ]
) il a donc besoin d'un espace blanc autour de lui. Sinon le shell "voit" la commande [01=01]
au lieu de la commande [
avec les paramètres séparés 01
, =
, 01
, et ]
. Chaque opérateur et opérande doit être un argument séparé pour le [
commande, donc un espace blanc est également nécessaire autour des opérateurs.
if [ "$month" = "01" ]
[$month="01"]
est un modèle de caractère générique correspondant à l'un des caractères de $month
ou "01
. S'il ne correspond à rien, il est laissé seul.
S'il y a un point-virgule après le crochet fermant, vous n'avez pas besoin d'espace avant, car le point-virgule fait toujours partie d'un jeton distinct.
if [ "$month" = "01" ]; then
Il en va de même pour la syntaxe à double crochet de bash (et de ksh et zsh).
Plusieurs conditions
Il existe deux manières de combiner des conditions :
-
dans
[
-
avec
[
séparé commandes combinées avec&&
ou||
Le regroupement avec des crochets est probablement plus facile dans [
.
if [ "$month" = "01" -a "$day" = "01" ] # -a for and, -o for or
if [ "$month" = "01" ] && [ "$day" = "01" ]
Le premier est à éviter car il n'est pas fiable (essayez par exemple avec month='!'
). Les problèmes avec un contenu de variable étrange peuvent être évités en utilisant d'abord la chaîne de sécurité (s'il y en a une) ; ou en utilisant [[
/]]
au lieu de [
/]
:
if [ "01" = "$month" -a "01" = "$day" ]