Je ne comprends pas la commande de pause

dans:

#!/bin/sh for var1 in 1 2 3 do for var2 in 0 5 do if [ $var1 -eq 2 -a $var2 -eq 0 ] then break 2 else echo "$var1 $var2" fi done done 

le résultat est:

 1 0 1 5 

et puis le script s’arrête.

mais si l’argument de la commande break (2) est supprimé, le résultat est:

 1 0 1 5 3 0 3 5 

Ce que je demande, c’est pourquoi 3 0 et 3 5 sont imprimés, lorsque le script est conditionné à ne pas casser? Le script n’a pas imprimé 2 0 et 2 5 , et 3 0 et 3 5 devraient également signaler une pause …

Pour résumer les commentaires, il y avait deux questions:

  • Pourquoi 3 0 imprimé après une break , mais pas après la break 2 ?

C’était parce que la condition ( [ $var1 -eq 2 -a $var2 -eq 0 ] ) vérifiait l’égalité plutôt que -ge , supérieure ou égale. Avec -ge il n’y aura pas d’ echo où les deux nombres sont plus grands.

La break 2 plutôt quitté les deux boucles, donnant ainsi le même effet dans ce cas particulier. Si la boucle avait été for var1 in 1 2 0 , le break 2 aurait également empêché 0 0 de se montrer car les deux boucles auraient été arrêtées.

  • Pourquoi 2 5 n’est-il pas imprimé après un brake ?

C’est parce que toute la boucle interne s’arrête lors d’une break , donc aucune autre itération n’aura de chance de echo . Pour éviter l’itération actuelle et essayer immédiatement la suivante, utilisez continue .

L’argument optionnel pour break indique à quelle boucle sortir. Si l’argument est omis, il sort de la boucle la plus interne. Avec un argument n il se casse de la nième boucle englobante.

Donc, break 2 sort de la boucle for var1 , car c’est la 2ème boucle englobante. Si vous le changez pour break , il ne fait que sortir de la boucle for var2 , il passe donc à la prochaine itération de for var1 .

Il suffit d’une simple break d’une boucle – la boucle interne dans votre cas. Cependant, si vous utilisez un entier supplémentaire dans l’instruction break, comme dans break 2 , alors le nombre de boucles spécifié est dépassé, c’est-à-dire deux pour les boucles dans votre cas. Comme il n’y a pas plus de deux boucles nestedes et qu’il n’y a plus de code après la boucle la plus externe, c’est effectivement la même chose que de terminer le script.