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
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
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
Le côlon est toujours "vrai":
while :; do foo; sleep 2; done
Vous pouvez utiliser des points-virgules pour séparer des instructions:
$ while [ 1 ]; do foo; sleep 2; done
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
Une boucle infinie très simple .. :)
while true ; do continue ; done
Fr votre question ce serait:
while true; do foo ; sleep 2 ; done
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
Pour surveiller un processus simple, utilisez plutôt watch
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;
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.
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;
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