GNU/Linux >> Tutoriels Linux >  >> Linux

Comment Bash évaluera-t-il le code suivant ?

Cette question comporte deux parties :

(a) Comprendre ce que fait le code extrait

(b) Comprendre la différence entre le statut de sortie et statut de retour dans le contexte de bash .

Voici le code extrait que j'essaie de comprendre :

if var=-2 && (( var+=2 ))
then
    echo "True"
else
    echo "False"
fi

L'exécution de ceci produit False . Je ne comprends pas pourquoi cela se produit.

Si je comprends bien, voici ce qui se passe peut-être avec le if condition :

(a) var=-2 crée un statut de sortie de 0, car l'affectation est un succès

(b) (( var+=2 )) ajoute 2 à la valeur de var et l'expression vaut zéro. Le statut de sortie est donc 1 pour ce terme

(c) 0 &&1 crée un statut existant de 0 qui est ensuite utilisé par if construire

Le if la construction est censée simplement vérifier le statut de sortie et quand il est à zéro, il prend le then chemin. À l'étape (c) ci-dessus, c'est zéro mais le script prend toujours le else chemin. Est-ce la bonne façon de comprendre cela ?

De plus, je continue de voir divers bash les textes utilisent le statut de sortie et statut de retour indifféremment.

Je doute var=-2 l'affectation aurait n'importe quel type de statut de sortie car ce n'est pas un programme. Mais toute clarification sur la différence entre les deux sera formidable.

Réponse acceptée :

C'est :

if
  first list of commands
then
  second list of commands
else
  third list of commands
fi

C'est pour exécuter la deuxième liste de commandes si la première liste de commandes retourne avec un true /succès (zéro) état de sortie, c'est-à-dire si la dernière commande d'exécution revient avec un état de sortie nul.

Dans :

var=-2 && ((var += 2))

C'est cmd1 && cmd2cmd2 n'est exécuté que si cmd1 réussit.

var=-2

Réussira généralement tant que $var n'a pas été mis en lecture seule, donc le ((var += 2)) la commande sera exécutée :

((arithmetic expression))

Renvoie succès /vrai tant que l'expression est correctement évaluée (pas d'erreur de syntaxe) et que le résultat de l'expression est non nul.

  • ((123)) , ((1 + 1)) , ((1 == 1)) renvoie vrai
  • ((0)) , ((-2 + 2)) , ((2 == -2)) renvoie faux.
  • ((4294967296 * 4294967296)) retourne false dans la plupart des shells à cause de l'enveloppement d'entiers 64 bits

var += 2 en tant qu'expression arithmétique, effectue l'affectation et résout la valeur affectée, ici 0, d'où le faux état de sortie.

Vous pouvez voir la valeur sur laquelle est basé le statut de sortie, en utilisant le $((...)) syntaxe d'expansion arithmétique :

$ echo "$((1 + 1)) $((2 == 2)) $((2 == -2)) $((var = -2)) $((var += 2))"
2 1 0 -2 0

Ou en l'affectant à une variable :

$ var=-2; ((result = (var += 2)))
$ echo "$? $result $var"
1 0 0

$? contient l'état de sortie de la commande précédente. En ce qui concerne if /then /else /fi est concerné, 0 signifie vrai, tout le reste signifie faux.

En relation:Mac - Comment configurer le package macports bash à utiliser à partir de terminal.app ?

La confusion vient ici du fait que pour les expressions arithmétiques, c'est l'inverse : signifie faux et tout le reste signifie vrai (par exemple, 2 == 2 est 1 tandis que 2 < 1 est ).

Pour éviter de vous soucier de la différence, oubliez simplement $? et ses valeurs possibles. Pensez simplement en termes de booléen true /faux , succès /échec .

 grep -q foo file

Renvoie vrai si foo se trouve dans file .

 [ "$a" = "$b" ]

Renvoie true si $a contient la même chose que $b .

 ((6 * 3 - 12))
 ((4 == 1))

Renvoie true si le résultat de l'expression arithmétique est un nombre non nul.

Peu importe que ces éléments soient vrais /faux sont exprimés en termes de 0 ou 1 du statut de sortie de ces grep /[ commandes ou ((...)) construire.


Linux
  1. Les codes de sortie de la ligne de commande Bash démystifiés

  2. Comment rechercher les codes de sortie pour les applications ?

  3. Comment détecter Bash>=4.0 ?

  4. Comment quitter un conteneur Docker

  5. Comment évaluer les chaînes en tant que nombres dans Bash

Comment écrire une boucle dans Bash

Comment commenter dans Bash

Bash break :comment sortir d'une boucle

Comment exécuter un script bash

Que sont les codes de sortie Bash sous Linux

Invite Bash avec le dernier code de sortie