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
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
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
Vous pouvez utiliser des points-virgules pour séparer les instructions:
$ while [ 1 ]; do foo; sleep 2; done
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
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
Une boucle infinie très simple.. :)
while true ; do continue ; done
Fr votre question serait:
while true; do foo ; sleep 2 ; done
Pour regarder un processus simple, Utilisez watch
à la place
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.
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;
, 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