Syntaxe pour une boucle infinie while Bash à une seule ligne

J'ai du mal à trouver la bonne combinaison de points-virgules et/ou d'accolades. Je voudrais faire ceci, mais comme un one-liner de la ligne de commande:

while [ 1 ]
do
    foo
    sleep 2
done
490
demandé sur codeforester 2009-08-17 20:31:47

11 réponses

while true; do foo; sleep 2; done

En passant, si vous le Tapez comme une multiligne (comme vous le montrez) à l'invite de commande, puis appelez 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
935
répondu Stefano Borini 2009-08-17 16:32:32

Il est également possible d'utiliser la commande sleep dans l'état de while. Faire une doublure à la recherche imho plus propre.

while sleep 2; do echo thinking; done
137
répondu Anssi 2012-11-06 10:34:41

Colon est toujours "vrai":

while :; do foo; sleep 2; done
59
répondu ajaaskel 2012-11-06 13:35:49

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

$ while [ 1 ]; do foo; sleep 2; done
24
répondu mipadi 2009-08-17 16:32:41

Vous pouvez également utiliser la commande until:

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

Noter que contrairement à while, until exécuter les commandes à l'intérieur de la boucle tant que la condition de test a une sortie qui n'est pas zéro.


En utilisant une boucle while:

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

En utilisant une boucle for:

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

Une autre façon d'utiliser until:

until [ ]; do foo; sleep 2; done
22
répondu devnull 2013-10-16 07:44:32

J'aime utiliser les points-virgules uniquement pour L'instruction WHILE, et l'opérateur && pour faire en sorte que la boucle fasse plus d'une chose...

Donc je le fais toujours comme ça

while true ; do echo Launching Spaceship into orbit && sleep 5s && /usr/bin/launch-mechanism && echo Launching in T-5 && sleep 1s && echo T-4 && sleep 1s && echo T-3 && sleep 1s && echo T-2 && sleep 1s && echo T-1 && sleep 1s && echo liftoff ; done
6
répondu Thomas 2011-08-30 00:29:09

Une boucle infinie très simple.. :)

while true ; do continue ; done

Fr votre question serait:

while true; do foo ; sleep 2 ; done
6
répondu Mack 2016-11-26 20:10:46

Pour regarder un processus simple, Utilisez watch à la place

4
répondu Christian Schwarz 2016-12-14 11:36:20

Si je peux donner deux exemples pratiques (avec un peu d '"émotion").

Cela écrit le nom de tous les fichiers terminés par ".jpg" dans le dossier "img":

for f in *; do if [ "${f#*.}" == 'jpg' ]; then echo $f; fi; done

Cela les supprime:

for f in *; do if [ "${f#*.}" == 'jpg' ]; then rm -r $f; fi; done

J'essaie juste de contribuer.

1
répondu Roger 2011-07-02 16:32:48

Si vous voulez que la boucle while s'arrête après une condition, et que votre commande foo renvoie une valeur non nulle lorsque cette condition est remplie, vous pouvez faire casser la boucle comme ceci:

while foo; do echo 'sleeping...'; sleep 5; done;

Par exemple, si la commande foo supprime des choses par lots, et qu'elle renvoie 1 lorsqu'il n'y a plus rien à supprimer.

Cela fonctionne bien si vous avez un script personnalisé qui doit exécuter une commande plusieurs fois jusqu'à une certaine condition. Vous écrivez le script pour quitter avec 1 lorsque la condition est rencontré et quitter avec 0 quand il devrait être exécuté à nouveau.

Par exemple, disons que vous avez un script python batch_update.py qui met à jour 100 lignes dans une base de données et renvoie 0 s'il y a plus à mettre à jour et 1 s'il n'y en a plus. La commande suivante vous permettra de mettre à jour les lignes 100 à la fois en dormant pendant 5 secondes entre les mises à jour:

while batch_update.py; do echo 'sleeping...'; sleep 5; done;
1
répondu Yep_It's_Me 2018-01-18 02:30:48

, Vous pouvez essayer cela aussi Attention: cela ne devrait pas être fait mais puisque la question demande une boucle infinie sans fin...c'est la façon dont vous pourriez le faire.

while [[ 0 -ne 1 ]]; do echo "it's looping";   sleep 2; done
1
répondu CPU 100 2018-03-10 14:16:42