La maggior parte dei linguaggi di programmazione supporta più alternative per il ciclo di righe di codice. Bash supporta nativamente i cicli 'while', loop 'up’ e il "for loop"’ meglio conosciuto. Questo post presenta e analizza i tre.
Quali sono Bash Loop?
Per impostare questo un po' meglio, dovremmo iniziare con la domanda cosa sono i loop?. I loop sono una costruzione del linguaggio di programmazione, che consente a uno sviluppatore di ripetere (In altre parole, ripetere) certe parti, il tutto, del codice all'interno di quella definizione di ciclo. Ora è facile da impostare Bash Loop come qualsiasi costrutto di linguaggio di programmazione in loop utilizzato in bash!
Bash supporta nativamente i loop basati su "for", 'fino a’ e 'mentre'. Ognuno di questi ha i suoi vantaggi, ma puoi già farti un'idea dei loro significati solo guardando l'idioma della parola principale. Come esempio, 'fino a’ porta a pensare naturalmente di "fare qualcosa fino a quando"’ e questo è ciò che fanno i loop bash 'fino a'; ripetere una certa quantità di codice (il tutto) fino a quando non viene soddisfatta una certa condizione.
Equivalentemente, los bucles 'mentre'’ continuano a funzionare finché una condizione non è più vera. Finire, il "per loop"’ si ripetono, come esempio, un numero definito di volte, equivalente a come scriveremmo 'per' 70 volte, fare…'. Questo ci aiuta a comprendere logicamente le caratteristiche uniche fornite da ogni ciclo e ad implementare un codice più leggibile..
di Cicli bash basati
Ai fini di questo post, vedremo il modo più nuovo per impostare Bash per i loop. Una definizione un po' più antica e meno moderna di di loop in bash can, come esempio, Assomiglia a questo: for i in $(seq 1 5); do echo $i; done
. Confrontiamolo con un aspetto più pulito, meglio strutturato e moderno. di cerchio:
per ((i=1;io<=5;io++)); fai eco $i; fatto
così semplice di Bash one-liner basato su (una definizione spesso usata negli ambienti Linux / Bash per concettualizzare un mini-script scritto su una singola riga) stamperà i numeri del 1 al 5 in ordine sequenziale. Impostiamo un valore iniziale per il i
variabile ($i
) assegnando il valore 1
lo stesso, come prima parte del nostro di definizione del ciclo, finito da a ;
delimitatore.
Prossimo, precisiamo che ne abbiamo solo uno da caricare "Meno o uguale a cinque"’ attraverso l'uso i<=5
. Successivamente indichiamo cosa dovrebbe succedere alla fine di ogni round, e questo sta aumentando la variabile i
per uno, oh, in un'abbreviazione di codifica comunemente usata (incluso nel linguaggio C ++, come esempio), questo si traduce come i++
.
Per finire specifichiamo l'inizio del nostro codice di ciclo usando do
, In altre parole, dopo aver terminato il nostro for
definizione del ciclo, proprio come qualsiasi altra conclusione di affermazione, insieme a ;
prima do
. Inoltre specifichiamo la fine del nostro codice di ciclo usando done
e noi echo
(stampare) il valore della nostra variabile io tra do
e done
.
Si noti inoltre in particolare che il do
la clausola stessa non finisce con ;
, e farlo causerebbe un errore. Considera il do
un prefisso a cosa fare, e ha più senso. Questo forse uno dei motivi per cui a volte è più pulito inserire le cose in uno script multilinea, dato che do
potrebbe essere solo l'ultima parola su una riga.
Anche quando si impostano altri tipi di loop, continueremo a mantenere la do
e done
clausole, e faremo sempre in modo di completare la nostra definizione del ciclo (In altre parole, prima do
) insieme a ;
, oltre a finalizzare la fine di ogni singola dichiarazione all'interno del nostro do...done
definizione del ciclo con ;
.
Mettiamolo in un piccolo copione per vedere più chiaramente come le cose possono funzionare in questo modo.:
#!/bin/bash for ((i=1;io<=10;i+=2)); do echo $i done
Dopo aver reso lo script eseguibile con chmod +x test.sh
, eseguiamo lo stesso. Sono state apportate alcune piccole modifiche allo script. Nota come questa volta, stiamo aumentando la variabile i
per due ogni volta. Questo viene fatto usando un'altra abbreviazione di codifica, vale a dire i+=2
che può essere letto come aumentare i di due. Puoi anche scrivere i=i+2
nello stesso posto, e funziona esattamente lo stesso.
Vediamo che iniziamo in 1e aumentare in 2 ogni volta che passiamo attraverso il ciclo, che finisce in 9. Il motivo per cui finisce in 9 è che il valore massimo è 10. Perché, dopo 9 il prossimo valore sarebbe 11, che è maggiore di 10 ed è per questo che non si vede / link.
Considera anche come ;
è stato rimosso dopo la linea dell'eco. Questo perché non è necessario terminare la fine di un'istruzione se invece c'è una situazione / carattere di fine riga. Questo è il caso qui; non abbiamo nessun altro comando dopo il echo $i
e la linea finisce subito (anche gli spazi alla fine della riga andrebbero bene, il principio è semplicemente non avere un altro comando a meno che quel nuovo comando non abbia il prefisso (e il precedente è finito) di ;
).
tempo metereologico Cicli bash basati
Prossimo, diamo un'occhiata a un ciclo bash, usando lo stesso do...done
definizione del ciclo, possiamo stabilire a mentre il ciclo basato su bash da eseguire fintanto che una data condizione è vera.
i=1; mentre [ $al 5 ]; fai eco $i; io=$[ io + 1 ]; fatto
In questo esempio, facciamo lo stesso del nostro primo di esempio di loop basato. Anche se la definizione sembra più complessa (ed è per questo che uno di loop potrebbe essere più adatto per questo particolare caso d'uso), è interessante vedere come possiamo stabilire a tempo metereologico loop allo stesso modo.
Qui per prima cosa impostiamo il nostro i
variabile, manualmente, in un comando separato terminato da ;
, per 1. Prossimo, abbiamo iniziato un tempo metereologico loop dove impostiamo una condizione, in un modo molto equivalente alla definizione di a if
dichiarazione (c'è un link alla fine di questo post a un post su if
dichiarazioni per maggiori informazioni), dove stiamo controllando se il i
la variabile è minore o uguale (-le
) dopo 5.
Dopo questo abbiamo il nostro frequente do...done
blocco in cui echo
la nostra variabile, e successivamente, in una nuova dichiarazione, manualmente, aumentare il valore del nostro i
variabile di uno in un calcolo matematico come definito dal $[...]
Idiomi di calcolo di Bash. Prossimo, esaminiamo un fino a bash basato su loop
fino a Cicli bash basati
Armati di ciò che abbiamo imparato finora, ora possiamo esaminare più facilmente quanto segue fino a basato sul ciclo bash:
i=1; fino a [ $io -gt 5 ]; fai eco $i; io=$[ io + 1 ]; fatto
Qui cerchiamo la condizione io più grande di 5 diventare vero. Fino a quel momento (In altre parole, un fino a loop basato su), stamperemo (usando echo
) la nostra variabile io e aumentare lo stesso con uno, uguale al nostro precedente tempo metereologico basato su esempi.
Possiamo vedere come la sintassi del fino a è molto equivalente a tempo metereologico comando. Nota anche che, a differenza di for
basato su comandi, Questi comandi sono alla ricerca di un certo condizione di persistere (insieme a tempo metereologico), o per un certo condizione per l'avvio (insieme a fino a). In questo modo è inoltre possibile utilizzare altri comandi in grado di restituire un output equivalente a true / impostore, come esempio grep -q
:
eco 1 > a
while grep -q '1' ./a; fare eco 'sì'; dormire 5; fatto
Qui aggiungiamo il numero 1 in un file chiamato une verifica l'esistenza del numero 1 all'interno di quel file usando a grep -q
(un grep silenzioso). Continuiamo a farlo (In altre parole tempo metereologico) finché non è più vero. Anche se è vero, stampiamo il testo sì e metti in pausa il loop per cinque secondi con sleep 5
. Nota come ogni comando finisce con ;
ancora.
Dopo circa 17 secondi, interrompiamo il nostro script usando CTRL + C, che è il metodo universale per fermare una procedura in esecuzione in bash (contemporaneamente al CTRL + z Più forte e più efficace rispetto all'interruzione immediata di una procedura, Ma questo è per un altro post!)
Fine
In questo post, controlliamo i cicli 'for', 'mentre’ y 'fino a’ che sono nativamente disponibili in Bash. Se sei interessato a più bash, dai un'occhiata ai test condizionali in bash: Se, poi, altro, funzioni elif e bash e variabili locali.
Godere!