La sintassi è:
while
first list of commands
do
second list of commands
done
che esegue il secondo elenco di comandi in un ciclo purché il primo elenco di comandi (quindi l'ultima esecuzione in tale elenco) abbia esito positivo.
In quel primo elenco di comandi , è possibile utilizzare il [
comando per eseguire vari tipi di test, oppure è possibile utilizzare il :
comando null che non fa nulla e restituisce esito positivo o qualsiasi altro comando.
while :; do cmd; done
Funziona cmd
all'infinito come :
sempre restituisce successo. Questo è il ciclo per sempre . È possibile utilizzare true
invece il comando per renderlo più leggibile:
while true; do cmd; done
La gente preferiva :
come :
era sempre stata incorporata mentre true
non lo era (molto tempo fa; la maggior parte delle shell ha true
costruito al giorno d'oggi) ¹.
Altre varianti che potresti vedere:
while [ 1 ]; do cmd; done
Sopra, stiamo chiamando il [
comando per verificare se la stringa "1" non è vuota (quindi sempre anche vera)
while ((1)); do cmd; done
Utilizzando la ((...))
sintassi Korn / bash / zsh per imitare il while(1) { ...; }
di C.
O più contorti come until false; do cmd; done
, until ! true
...
A volte sono aliasati come:
alias forever='while :; do'
Quindi puoi fare qualcosa del tipo:
forever cmd; done
Poche persone si rendono conto che la condizione è un elenco di comandi. Ad esempio, vedi persone che scrivono:
while :; do
cmd1
cmd2 || break
cmd3
done
Quando avrebbero potuto scrivere:
while
cmd1
cmd2
do
cmd3
done
Ha senso che sia un elenco poiché spesso si desidera fare cose come quelle while cmd1 && cmd2; do...; done
che sono anche liste di comandi.
In ogni caso, si noti che [
è un comando come un altro (sebbene sia incorporato nelle moderne shell tipo Bourne), non deve essere utilizzato esclusivamente negli elenchi delle condizioni if
/ while
/ until
e tali elenchi delle condizioni non hanno per usare quel comando più di ogni altro comando.
¹ :
è anche più breve e accetta argomenti (che ignora). Mentre il comportamento di true
o false
non è specificato se si passa qualsiasi argomento. Quindi uno può fare per esempio:
while : you wait; do
something
done
Ma il comportamento di:
until false is true; do
something
done
non è specificato (anche se funzionerebbe nella maggior parte delle shell / false
implementazioni).
:
non fa nulla ma esce sempre con il codice di ritorno 0. Quindi, è lo stessowhile true
(supponendo che il tuo sistema abbia untrue
eseguibile).