GNU/Linux >> Tutoriels Linux >  >> Linux

Comment obtenir le statut de sortie d'une boucle dans bash

Quelque chose comme ça ?

while true; do
    case $RANDOM in *0) exit 27 ;; esac
done

Ou comme ça ?

rc=0
for file in *; do
    grep fnord "$file" || rc=$?
done
exit $rc

La vraie question est de décider si le code de sortie de la boucle doit être un succès ou un échec si une itération échoue. Il y a des scénarios où l'un a plus de sens que l'autre, et d'autres où ce n'est pas du tout clair.


L'état de la boucle est l'état de la dernière commande qui s'exécute. Vous pouvez utiliser break pour sortir de la boucle, mais si le break réussit, le statut de la boucle sera 0 . Cependant, vous pouvez utiliser un sous-shell et quitter au lieu de rompre. En d'autres termes :

for i in foo bar; do echo $i; false; break; done; echo $?  # The loop succeeds
( for i in foo bar; do echo $i; false; exit; done ); echo $? # The loop fails

Vous pouvez également placer la boucle dans une fonction et en renvoyer une valeur. ex :

in() { local c="$1"; shift; for i; do test "$i" = "$c" && return 0; done; return 1; }

Le manuel bash dit :

while list-1; do list-2; done
until list-1; do list-2; done
  [..]The exit status of the while and until commands is the exit status
  of the last command executed in list-2, or zero if none was executed.[..]

La dernière commande exécutée à l'intérieur la boucle est break . Et la valeur de sortie de break vaut 0 (voir :help break ).

C'est pourquoi votre programme continue de sortir avec 0.


Linux
  1. Comment obtenir en toute sécurité la version de Ksh ?

  2. Comment supprimer la sortie de Grep, afin qu'elle ne renvoie que le statut de sortie ?

  3. Bash :Boucle jusqu'à ce que l'état de sortie de la commande soit égal à 0

  4. Comment obtenir le code de sortie du processus généré dans le script shell attendu ?

  5. Comment obtenir un masque de réseau à partir de bash ?

Bash continue :comment reprendre une boucle

Comment utiliser la commande de lecture Bash

Bash break :comment sortir d'une boucle

Comment obtenir la taille d'un répertoire sous Linux

Comment obtenir le Tty dans lequel Bash est en cours d'exécution ?

La boucle Bash FOR expliquée et simplifiée