GNU/Linux >> Tutoriels Linux >  >> Linux

Parenthèses dans la condition If :pourquoi ai-je des erreurs de syntaxe sans espace ?

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 :

  1. dans [

  2. 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" ]

Linux
  1. Pourquoi l'invite Bash est-elle boguée lorsque je parcours l'historique ? ?

  2. Grep - Pourquoi les crochets dans le modèle Grep suppriment-ils le processus Grep des résultats Ps?

  3. Les tests Bash sont-ils si pointilleux sur les espaces blancs ?

  4. Pourquoi l'expansion variable sans $ fonctionne-t-elle dans les expressions ?

  5. Vérifier les fichiers de configuration Linux pour les erreurs de syntaxe

Comment vérifier la syntaxe d'un script Bash sans l'exécuter ?

Exécutez un ls sans obtenir le chemin complet

Pourquoi est-ce que je reçois une autorisation refusée lors de l'exécution de ssh-add ?

Comment puis-je sortir une commande dans un fichier, sans obtenir un fichier vide en cas d'erreur ?

Pourquoi n'ai-je pas de coloration syntaxique lorsque je sudo vi <filename> ?

Pourquoi est-ce que je vois des erreurs de résolution IPv6 malgré la désactivation d'IPv6 dans la liaison ?