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
bash
loops
while-loop
Brian Deacon
la source
la source
Réponses:
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.
la source
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.
la source
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":
la source
: [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:
la source
Vous pouvez également utiliser la
until
commande: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:Utiliser une
for
boucle:Une autre façon d'utiliser
until
:la source
until ((0)); do foo; sleep 2; done
ne semble pas fonctionner. Elle continue infinie.Une boucle infinie très simple .. :)
Fr votre question ce serait:
la source
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
la source
&&
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ôtla source
En utilisant
while
:Utilisation de la
for
boucle:Utilisation
Recursion
, (un peu différent de ce qui précède, l'interruption du clavier ne l'arrêtera pas)la source
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: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 avec0
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 renvoie0
s'il y en a plus à mettre à jour et1
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:la source
foo
commande exit avec du code1
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":
Cela les supprime:
J'essaye juste de contribuer.
la source
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.
la source