Question Syntaxe pour une boucle Bash infinite à ligne unique


J'ai du mal à trouver la bonne combinaison de points-virgules et / ou d'accolades. Je voudrais le faire, mais en tant que doublure de la ligne de commande:

while [ 1 ]
do
    foo
    sleep 2
done

478
2017-08-17 16:31


origine


Réponses:


while true; do foo; sleep 2; done

Par ailleurs, si vous le tapez comme une multiligne (comme vous le montrez) à l'invite de commande et que vous 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

909
2017-08-17 16:32



Il est également possible d'utiliser la commande sleep dans son état. Rendre un liner plus propre imho.

while sleep 2; do echo thinking; done

136
2017-11-02 10:53



Le colon est toujours "vrai":

while :; do foo; sleep 2; done

58
2017-11-06 13:35



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

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

24
2017-08-17 16:32



Vous pouvez également utiliser until commander:

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

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


Utilisant un while boucle:

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

Utilisant un for boucle:

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

Une autre façon d'utiliser until:

until [ ]; do foo; sleep 2; done

20
2017-08-25 12:49



J'aime utiliser les points-virgules uniquement pour l'instruction WHILE, et l'opérateur && pour 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
2018-01-29 10:43



Une boucle infinie très simple .. :)

while true ; do continue ; done

Fr ta question ce serait:

while true; do foo ; sleep 2 ; done

5
2017-07-09 05:44



Pour une utilisation simple de la surveillance des processus watch au lieu


3
2017-12-14 11:35



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
2017-07-02 16:32



Si vous voulez que la boucle while s'arrête après certaines conditions, et foo commande retourne non nul lorsque cette condition est remplie, alors vous pouvez obtenir que la boucle se casse comme ceci:

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

Par exemple, si le foo commande supprime des éléments par lots et renvoie 1 lorsque rien ne reste à supprimer.

Cela fonctionne bien si vous avez un script personnalisé qui doit exécuter plusieurs fois une commande jusqu'à une certaine condition. Vous écrivez le script pour quitter avec 1 lorsque la condition est remplie et sortir 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
2018-05-16 06:50



Vous pouvez essayer cela aussi ATTENTION: ceci vous ne devriez pas faire mais puisque la question demande une boucle infinie sans fin ... c'est comme ça que vous pouvez le faire.

while [[ 0 -ne 1 ]]; do echo "it's looping";   sleep 2; done

1
2018-02-07 20:47