Ho problemi a trovare la giusta combinazione di punti e virgola e / o parentesi graffe. Mi piacerebbe farlo, ma come una riga dalla riga di comando:
while [ 1 ]
do
foo
sleep 2
done
Ho problemi a trovare la giusta combinazione di punti e virgola e / o parentesi graffe. Mi piacerebbe farlo, ma come una riga dalla riga di comando:
while [ 1 ]
do
foo
sleep 2
done
Risposte:
while true; do foo; sleep 2; done
A proposito, se lo digiti come una multilinea (come stai mostrando) al prompt dei comandi e poi chiami la cronologia con la freccia su, la otterrai su una singola riga, correttamente punteggiata.
$ while true
> do
> echo "hello"
> sleep 2
> done
hello
hello
hello
^C
$ <arrow up> while true; do echo "hello"; sleep 2; done
cmdhist
opzione se stai usando bash?
while true; do sh /Users/myuser/bin/vpn ; done
È anche possibile utilizzare il comando sleep nelle condizioni while. Rendere l'imho di un solo aspetto più pulito.
while sleep 2; do echo thinking; done
while echo thinking ; do sleep 2 ; done
Naturalmente se il comando [while] fallisce, il ciclo termina, quindi dovresti, while echo thinking || true ; do sleep 2 ; done
ma poi torni awhile true ; ...
I due punti sono sempre "veri":
while :; do foo; sleep 2; done
: [arguments]
Nessun effetto; il comando non fa altro che espandere gli argomenti ed eseguire i reindirizzamenti specificati. Viene restituito un codice di uscita zero.
È possibile utilizzare i punti e virgola per separare le istruzioni:
$ while [ 1 ]; do foo; sleep 2; done
Puoi anche usare il until
comando:
until ((0)); do foo; sleep 2; done
Si noti che, al contrario di while
, until
eseguirà i comandi all'interno del loop purché la condizione di test abbia uno stato di uscita diverso da zero.
Utilizzando un while
loop:
while read i; do foo; sleep 2; done < /dev/urandom
Utilizzando un for
loop:
for ((;;)); do foo; sleep 2; done
Un altro modo usando until
:
until [ ]; do foo; sleep 2; done
until ((0)); do foo; sleep 2; done
non sembra al lavoro. È infinito continuo.
Mi piace usare i punti e virgola solo per l'istruzione WHILE e l'operatore && per fare in modo che il ciclo faccia più di una cosa ...
Quindi lo faccio sempre così
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
&&
in the loop è lo stesso di qualsiasi altra volta, non è vero. Hai bisogno che accada la seconda cosa solo se accade la prima, quindi basta usare &&
altro ;
. Davvero, vuoi mantenere i contenuti di quel ciclo brevi e semplici, idealmente solo un comando, quindi una funzione o uno script.
Per la semplice visione di processo utilizzare watch
invece
Utilizzando while
:
while true; do echo 'while'; sleep 2s; done
Utilizzando for
Loop:
for ((;;)); do echo 'forloop'; sleep 2; done
Usando Recursion
, (un po 'diverso da quello sopra, l'interrupt della tastiera non lo fermerà)
list(){ echo 'recursion'; sleep 2; list; } && list;
Se vuoi che il ciclo while si fermi dopo una certa condizione e il tuo foo
comando restituisce un valore diverso da zero quando questa condizione è soddisfatta, puoi interrompere il ciclo in questo modo:
while foo; do echo 'sleeping...'; sleep 5; done;
Ad esempio, se il foo
comando sta eliminando elementi in batch e restituisce 1 quando non è rimasto nulla da eliminare.
Funziona bene se si dispone di uno script personalizzato che deve eseguire un comando più volte fino a quando non si verifica una condizione. Si scrive lo script con 1
cui uscire quando viene soddisfatta la condizione e si esce con 0
quando deve essere eseguito nuovamente.
Ad esempio, supponiamo di avere uno script Python batch_update.py
che aggiorna 100 righe in un database e restituisce 0
se ce ne sono altre da aggiornare e 1
se non ce ne sono più. Il seguente comando ti consentirà di aggiornare le righe 100 alla volta con sospensione per 5 secondi tra gli aggiornamenti:
while batch_update.py; do echo 'sleeping...'; sleep 5; done;
foo
uscire il comando con il codice 1
quando vuoi che il ciclo while si interrompa. Ho aggiornato la mia risposta con un esempio.
Se posso fare due esempi pratici (con un po 'di "emozione").
Questo scrive il nome di tutti i file terminati con ".jpg" nella cartella "img":
for f in *; do if [ "${f#*.}" == 'jpg' ]; then echo $f; fi; done
Questo li cancella:
for f in *; do if [ "${f#*.}" == 'jpg' ]; then rm -r $f; fi; done
Sto solo cercando di contribuire.
ls -1 *.jpg
erm *.jpg
Puoi provare anche questo ATTENZIONE: questo non dovresti farlo ma poiché la domanda richiede un ciclo infinito senza fine ... ecco come potresti farlo.
while [[ 0 -ne 1 ]]; do echo "it's looping"; sleep 2; done