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:
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.
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.