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 ma mauvaise reçoit 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
bash
shell
shell-script
test
whitespace
Kumar1
la source
la source
[
. En outre, examinez l'elif
instruction; cela vous aidera à nettoyer les choses. En outre, les points-virgules après les instructions if ne sont pas nécessaires, mais ne sont pas non plus incorrects, juste étranges.if [ ... ]; then
), donc pas si inhabituel.Réponses:
[
n'est ni un métacaractère ni un opérateur de contrôle (pas même un mot réservé; même pour]
), il a donc besoin d'espaces autour. Sinon , le shell « voit » la commande au[01=01]
lieu de la commande[
avec les paramètres séparés01
,=
,01
et]
. Chaque opérateur et opérande doit être un argument distinct de la[
commande, donc des espaces sont également nécessaires autour des opérateurs.[$month="01"]
est un motif générique correspondant à l'un des caractères de$month
ou"01
. Si cela ne correspond à rien, il est laissé seul.S'il y a un point-virgule après le crochet de fermeture, vous n'avez pas besoin d'espace avant, car le point-virgule fait toujours partie d'un jeton distinct.
Il en va de même pour la syntaxe double crochet de bash (et ksh et zsh).
Plus d'une condition
Il existe deux façons de combiner des conditions:
dans
[
avec des
[
commandes séparées combinées avec&&
ou||
Le regroupement avec des crochets est probablement plus facile à l'intérieur
[
.Le premier doit être évité car il n'est pas fiable (essayez par exemple avec
month='!'
). Les problèmes de 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[
/]
:la source
[
quand-a
/-o
ne sont pas utilisés est toujours fiable avec des shells conformes POSIX. Il n'y a aucun avantage à utiliser-a/-o
Over&&/||
. Je découragerais certainement son utilisation. Notez que ce[[
n'est pas POSIX.Une autre façon de l'écrire:
la source
case
déclaration. Si vous en avez plus d'unelif
, vous devriez probablement l'utilisercase
.Voici donc votre réponse:
Vous devez donc mettre "espace" entre crochets et variable / valeur.
la source
==
au lieu de standard=
.[
test
est=
.[
si pour les tests, il ne fait aucune affectation, il n'est donc pas nécessaire de lever l'ambiguïté. Certaines[
implémentations prennent==
en charge une extension par rapport à la norme, mais pas toutes. Le shell de Bourneash
,posh
le[
s ou le/bin/[
de certains systèmes par exemple ne le font pas.==
a été ajouté parksh
, je suppose pour la cohérence avec le même opérateur dans sa nouvelle(( ... ))
construction (qui a à la fois = et ==, mais il n'a pas de standard)