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
cmdhist
option 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 ; done
mais 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 until
commande:
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 état de sortie qui n'est pas nul.
Utiliser une while
boucle:
while read i; do foo; sleep 2; done < /dev/urandom
Utiliser une for
boucle:
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; done
ne 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 watch
plutôt
En utilisant while
:
while true; do echo 'while'; sleep 2s; done
Utilisation de la for
boucle:
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 foo
commande 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 foo
commande 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 1
lequel quitter lorsque la condition est remplie et avec 0
quand il doit être exécuté à nouveau.
Par exemple, supposons que vous ayez un script python batch_update.py
qui met à jour 100 lignes dans une base de données et renvoie 0
s'il y en 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;
foo
commande exit avec du code 1
lorsque 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 *.jpg
etrm *.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