717 votes

Syntaxe d'une boucle while infinie BASH à ligne unique

J'ai du mal à trouver la bonne combinaison de points-virgules et/ou d'accolades. J'aimerais faire ceci, mais en une seule phrase, à partir de la ligne de commande :

while [ 1 ]
do
    foo
    sleep 2
done

5 votes

Remplacer les nouvelles lignes par des points-virgules. Il en va de même pour les boucles "for".

23 votes

@Tom : cela ne fonctionne pas toujours. après le do, vous devez avoir la première commande, pas un point-virgule.

1391voto

Stefano Borini Points 36904
while true; do foo; sleep 2; done

À propos, si vous le tapez sur plusieurs lignes (comme vous le montrez) à l'invite de commande et que vous appelez ensuite l'historique avec la flèche vers le haut, vous l'obtiendrez sur une seule ligne, correctement ponctuée.

$ while true
> do
>    echo "hello"
>    sleep 2
> done
hello
hello
hello
^C
$ <arrow up> while true; do    echo "hello";    sleep 2; done

4 votes

"Si vous le tapez sur plusieurs lignes (comme vous le faites) à l'invite de commande et que vous appelez ensuite l'historique avec la flèche vers le haut, vous l'obtiendrez sur une seule ligne, correctement ponctuée", ce n'était pas vrai pour moi.

0 votes

@VincentScheib, vérifier cmdhist si vous utilisez bash ?

0 votes

Excellent ! Fonctionne parfaitement sur Mavericks (Mac OS-X 10.9) et me permet de garder un vpn en marche. Openconnect se déconnecte après quelques heures avec une erreur de mauvais cookie. Je mets donc la commande openconnect dans un shell script, sudo su pour devenir Root, et j'utilise cette ligne de cmd : while true; do sh /Users/myuser/bin/vpn ; done

186voto

Anssi Points 531

Il est également possible d'utiliser la commande sleep dans l'état de while. Cela permet de rendre le one-liner plus propre.

while sleep 2; do echo thinking; done

21 votes

Cela fait plus que changer la syntaxe, cela exécute la commande après le sommeil. Dans la réponse précédente, la commande est exécutée immédiatement. Une remarque s'impose.

3 votes

@DanGordon while echo thinking ; do sleep 2 ; done Bien entendu, si la commande [while] échoue, la boucle se termine. while echo thinking || true ; do sleep 2 ; done mais vous revenez ensuite à while true ; ...

76voto

ajaaskel Points 241

Le colon est toujours "vrai" :

while :; do foo; sleep 2; done

22 votes

Pourquoi le colon est-il toujours vrai ?

11 votes

L'ananas sous la mer : Extrait de la page de manuel de bash : (dans la section COMMANDES DE CONSTRUCTION DE SHELL) : [arguments] Aucun effet ; la commande ne fait rien d'autre que de développer les arguments et d'effectuer les redirections spécifiées. Un code de sortie de zéro est renvoyé.

5 votes

Cette syntaxe est recommandée car : fait partie du shell lui-même, c'est-à-dire que : est une commande intégrée au shell.

42voto

mipadi Points 135410

Vous pouvez utiliser des points-virgules pour séparer les déclarations :

$ while [ 1 ]; do foo; sleep 2; done

4 votes

J'aime cette réponse parce qu'elle explique quand et pourquoi ; (point-virgule) est nécessaire.

31voto

devnull Points 45016

Vous pouvez également utiliser until commandement :

until ((0)); do foo; sleep 2; done

Notez que, contrairement à while , until exécute les commandes à l'intérieur de la boucle tant que la condition de test a un statut de sortie différent de zéro.


Utilisation d'un while boucle :

while read i; do foo; sleep 2; done < /dev/urandom

Utilisation d'un for boucle :

for ((;;)); do foo; sleep 2; done

Une autre façon d'utiliser until :

until [ ]; do foo; sleep 2; done

0 votes

En until ((0)); do foo; sleep 2; done ne semble pas fonctionner. Il continue à être infini.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X