J'ai du mal à trouver la bonne combinaison de points-virgules et / ou d'accolades. Je voudrais le faire, mais en tant que ligne unique à partir de la ligne de commande:
while [ 1 ]
do
foo
sleep 2
done
J'ai du mal à trouver la bonne combinaison de points-virgules et / ou d'accolades. Je voudrais le faire, mais en tant que ligne unique à partir de la ligne de commande:
while [ 1 ]
do
foo
sleep 2
done
Réponses:
while true; do foo; sleep 2; done
Soit dit en passant, si vous le tapez sous forme de multiligne (comme vous le montrez) à l'invite de commandes, 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
cmdhistoption si vous utilisez bash?
while true; do sh /Users/myuser/bin/vpn ; done
Il est également possible d'utiliser la commande sleep dans l'état while. Rendre une doublure plus propre à mon humble avis.
while sleep 2; do echo thinking; done
while echo thinking ; do sleep 2 ; done Bien sûr, si la commande [while] échoue, la boucle se termine, vous devriez donc le faire, while echo thinking || true ; do sleep 2 ; donemais vous revenez àwhile true ; ...
Le colon est toujours "vrai":
while :; do foo; sleep 2; done
: [arguments] Aucun effet; la commande ne fait rien d'autre que d'étendre les arguments et d'effectuer les redirections spécifiées. Un code de sortie zéro est renvoyé.
Vous pouvez utiliser des points-virgules pour séparer les instructions:
$ while [ 1 ]; do foo; sleep 2; done
Vous pouvez également utiliser la untilcommande:
until ((0)); do foo; sleep 2; done
Notez que contrairement à while, untilexécuterait les commandes à l'intérieur de la boucle tant que la condition de test a un état de sortie qui n'est pas nul.
Utiliser une whileboucle:
while read i; do foo; sleep 2; done < /dev/urandom
Utiliser une forboucle:
for ((;;)); do foo; sleep 2; done
Une autre façon d'utiliser until:
until [ ]; do foo; sleep 2; done
until ((0)); do foo; sleep 2; donene semble pas fonctionner. Elle continue infinie.
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
&&dans la boucle est la même que n'importe quel autre moment n'est-ce pas vraiment. Avez-vous besoin que la deuxième chose se produise uniquement si la première se produit, alors utilisez &&else ;suffit. Vraiment, vous voulez garder le contenu de cette boucle court et simple, idéalement une seule commande, donc une fonction ou un script.
Pour un processus simple d'observation, utilisez watchplutôt
En utilisant while:
while true; do echo 'while'; sleep 2s; done
Utilisation de la forboucle:
for ((;;)); do echo 'forloop'; sleep 2; done
Utilisation Recursion, (un peu différent de ce qui précède, l'interruption du clavier ne l'arrêtera pas)
list(){ echo 'recursion'; sleep 2; list; } && list;
Si vous voulez que la boucle while s'arrête après une condition et que votre foocommande retourne non nulle lorsque cette condition est remplie, vous pouvez obtenir la boucle pour se rompre comme ceci:
while foo; do echo 'sleeping...'; sleep 5; done;
Par exemple, si la foocommande supprime des éléments par lots et renvoie 1 lorsqu'il ne reste plus rien à supprimer.
Cela fonctionne bien si vous disposez d'un script personnalisé qui doit exécuter une commande plusieurs fois jusqu'à une certaine condition. Vous écrivez le script avec 1lequel quitter lorsque la condition est remplie et avec 0quand il doit être exécuté à nouveau.
Par exemple, supposons que vous ayez un script python batch_update.pyqui met à jour 100 lignes dans une base de données et renvoie 0s'il y en a plus à mettre à jour et 1s'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;
foocommande exit avec du code 1lorsque vous voulez que la boucle while se casse. J'ai mis à jour ma réponse avec un exemple.
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'essaye juste de contribuer.
ls -1 *.jpgetrm *.jpg
Vous pouvez essayer cela aussi AVERTISSEMENT: cela, vous ne devriez pas le faire, mais puisque la question demande une boucle infinie sans fin ... c'est comment vous pouvez le faire.
while [[ 0 -ne 1 ]]; do echo "it's looping"; sleep 2; done