web-dev-qa-db-fra.com

Syntaxe pour une boucle while infinie Bash sur une seule ligne

J'ai du mal à trouver la bonne combinaison de points-virgules et/ou d'accolades. J'aimerais faire ceci, mais en tant que ligne unique depuis la ligne de commande:

while [ 1 ]
do
    foo
    sleep 2
done
570
Brian Deacon
while true; do foo; sleep 2; done

En passant, si vous le tapez en multiligne (comme vous le montrez) dans 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
1098
Stefano Borini

Il est également possible d'utiliser la commande sleep dans l'état. Rendre un revêtement plus propre à l’imho.

while sleep 2; do echo thinking; done
156
Anssi

Le côlon est toujours "vrai":

while :; do foo; sleep 2; done
66
ajaaskel

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

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

Vous pouvez également utiliser la commande until:

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 état de sortie non nul.


Utilisation d'une boucle while:

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

Utilisation d'une boucle for:

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

Une autre façon en utilisant until:

until [ ]; do foo; sleep 2; done
27
devnull

Une boucle infinie très simple .. :)

while true ; do continue ; done

Fr votre question ce serait:

while true; do foo ; sleep 2 ; done
9
Mack

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
8
Thomas

Pour surveiller un processus simple, utilisez plutôt watch

7
Christian Schwarz

Si vous voulez que la boucle while s'arrête après une condition et que votre commande foo renvoie une valeur autre que zéro lorsque cette condition est remplie, vous pouvez obtenir la boucle qui se rompt comme ceci:

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

Par exemple, si la commande foo supprime des éléments par lots, elle renvoie 1 lorsqu'il ne reste plus rien à supprimer.

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

Par exemple, supposons que vous ayez un python script batch_update.py qui met à jour 100 lignes d'une base de données et renvoie 0 s'il y a plus d'éléments à mettre à jour et 1 s'il n'y en a pas. plus. La commande suivante vous permettra de mettre à jour les lignes 100 à la fois avec une pause de 5 secondes entre les mises à jour:

while batch_update.py; do echo 'sleeping...'; sleep 5; done;
5
Yep_It's_Me

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

Ceci é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'essaye juste de contribuer.

2
Roger

Utiliser while:

while true; do echo 'while'; sleep 2s; done

Utilisation de for Loop:

for ((;;)); do echo 'forloop'; sleep 2; done

Utilisation de Recursion, (un peu différent de ce qui précède, l’interruption du clavier ne l’arrête pas)

list(){ echo 'recursion'; sleep 2; list; } && list;
2
Muhammad Soliman

Vous pouvez aussi essayer ceci. AVERTISSEMENT: vous ne devriez pas le faire, mais puisque la question demande une boucle infinie sans fin ... voici comment vous pouvez le faire.

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