Quelle est la meilleure façon d'émuler une boucle do-while dans Bash?
Je pourrais vérifier la condition avant d'entrer dans la while
boucle, puis continuer à vérifier la condition dans la boucle, mais c'est du code dupliqué. Existe-t-il un moyen plus propre?
Pseudo code de mon script:
while [ current_time <= $cutoff ]; do
check_if_file_present
#do other stuff
done
Cela ne fonctionne pas check_if_file_present
s'il est lancé après l' $cutoff
heure, et un do-while le ferait.
until
commutateur?until
évaluera également la condition avant d'exécuter le corps de la boucleRéponses:
Deux solutions simples:
Exécutez votre code une fois avant la boucle while
Ou:
la source
:
est un intégré, équivalent au intégrétrue
. Les deux "ne réussissent rien".true
est un programme réel alors qu'il:
est intégré. Le premier sort simplement avec0
(etfalse
avec1
) le second ne fait absolument rien. Vous pouvez vérifier avecwhich true
.:
est toujours utilisable à la place detrue
dans Bash. Essayez-le avecwhile :; do echo 1; done
.true
n'est pas un intégré dans Bash. C'est un programme généralement trouvé dans/bin
.type true
in bash (tout le chemin du retour à bash 3.2) renvoietrue is a shell builtin
. C'est vrai que/bin/true
c'est un programme; ce qui n'est pas vrai avec true, c'est que cetrue
n'est pas un builtin. (tl; dr: true est un bash intégré ET un programme)Placez le corps de votre boucle après
while
et avant le test. Le corps réel de lawhile
boucle doit être un no-op.Au lieu des deux points, vous pouvez utiliser
continue
si vous trouvez cela plus lisible. Vous pouvez également insérer une commande qui ne s'exécutera qu'entre les itérations (pas avant le premier ou après le dernier), commeecho "Retrying in five seconds"; sleep 5
. Ou imprimez des délimiteurs entre les valeurs:J'ai changé le test pour utiliser des doubles parenthèses puisque vous semblez comparer des entiers. À l'intérieur de doubles crochets, les opérateurs de comparaison tels que
<=
sont lexicaux et donneront un résultat erroné lors de la comparaison de 2 et 10, par exemple. Ces opérateurs ne fonctionnent pas entre crochets simples.la source
while { check_if_file_present; ((current_time<=cutoff)); }; do :; done
? C'est-à-dire que les commandes à l'intérieur de lawhile
condition sont effectivement séparées par des points-virgules et non par exemple&&
, et regroupées par{}
?&&
ou||
car cela les fait effectivement partie du test qui contrôle lewhile
. À moins que vous n'utilisiez cette construction sur la ligne de commande, je ne le ferais pas en une seule ligne (dans un script, en particulier) car l'intention est illisible.while false; false; false; true; do echo here; break; done
sorties "ici"Nous pouvons émuler une boucle do-while dans Bash avec
while [[condition]]; do true; done
comme ceci:À titre d'exemple. Voici mon implémentation pour obtenir une connexion ssh dans un script bash:
Il donnera la sortie dans l'ordre comme ci-dessous:
la source