Attenzione ai loop infiniti!
La capacità di eseguire il loop è una caratteristica molto potente dello scripting bash. I loop hanno una varietà di casi d'uso.
In questo tutorial esplorerai le tre diverse strutture di loop bash. Imparerai anche come usare i loop per attraversare gli elementi dell'array.
Inoltre, imparerai come utilizzare le istruzioni break and continue per controllare i loop e, infine, imparerai come creare loop infiniti.
For Loop in Bash
I cicli For sono uno dei tre diversi tipi di strutture di loop che puoi utilizzare in bash. Esistono due stili diversi per scrivere un ciclo for.
- Cicli for in stile C
- Utilizzo del ciclo for su un elenco/intervallo di elementi
Loop in stile C in Bash
Se hai familiarità con un linguaggio di programmazione simile a C o C++, riconoscerai la seguente sintassi di ciclo for:
for ((initialize ; condition ; increment)); do
[COMMANDS]
done
Utilizzando la suddetta sintassi in stile C, il seguente ciclo for stamperà "Hello Friend" dieci volte:
for ((i = 0 ; i < 10 ; i++)); do
echo "Hello Friend"
done
Il ciclo for ha prima inizializzato la variabile intera i a zero quindi verifica la condizione (i <10); se true, il ciclo esegue la riga echo “Hello Friend” e incrementa la variabile i di 1 , quindi il ciclo viene eseguito ancora e ancora fino a i non è più inferiore a 10 .
[email protected]:~$ bash hello.sh
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Hello Friend
Elenco/intervallo per loop in Bash
Esiste anche un'altra variazione della sintassi del ciclo for che è particolarmente utile se si lavora con un elenco di file (o stringhe), intervallo di numeri, array, output di un comando, ecc. La sintassi dell'elenco/intervallo for loop ha la forma seguente :
for item in [LIST]; do
[COMMANDS]
done
Ad esempio, il seguente ciclo for fa esattamente la stessa cosa del ciclo for in stile C che avevi creato nella sezione precedente:
for i in {1..10}; do
echo "Hello Friend"
done
Il var.sh lo script seguente produrrà tutti i file e le directory esistenti in /var directory:
#!/bin/bash
for i in /var/*; do
echo $i
done
Di seguito è riportato un esempio di output quando si esegue lo script var.sh:
[email protected]:~$ ./var.sh
/var/backups
/var/cache
/var/crash
/var/lib
/var/local
/var/lock
/var/log
/var/mail
/var/metrics
/var/opt
/var/run
/var/snap
/var/spool
/var/tmp
Mentre si ripete in Bash
Il ciclo while è un altro ciclo popolare e intuitivo che puoi utilizzare negli script bash. La sintassi generale per un ciclo while è la seguente:
while [ condition ]; do
[COMMANDS]
done
Ad esempio, il seguente 3x10.sh lo script utilizza un ciclo while che stamperà i primi dieci multipli del numero tre:
#!/bin/bash
num=1
while [ $num -le 10 ]; do
echo $(($num * 3))
num=$(($num+1))
done
Ecco l'output dello script precedente:
[email protected]:~$ ./3x10.sh
3
6
9
12
15
18
21
24
27
30
Per prima cosa ha inizializzato il num variabile a 1; quindi, il ciclo while durerà fino a num è minore o uguale a 10 . All'interno del corpo del ciclo while, il comando echo stampa num moltiplicato per tre e quindi incrementa num di 1 .
Fino a loop in Bash
Se provieni da un background C/C++, potresti cercare un ciclo do-while ma quello non esiste in bash.
C'è un altro tipo di loop che esiste in bash. Il ciclo until segue la stessa sintassi del ciclo while:
until [ condition ]; do
[COMMANDS]
Done
La differenza fondamentale tra il ciclo fino e il ciclo while è nella condizione di test. Un ciclo while continuerà a funzionare finché la condizione di test è vera; dall'altro lato, un ciclo until continuerà a funzionare finché la condizione di test è falsa!
Ad esempio, puoi creare facilmente il 3x10.sh script con un ciclo until invece di un ciclo while; il trucco qui è negare la condizione di test:
#!/bin/bash
num=1
until [ $num -gt 10 ]; do
echo $(($num * 3))
num=$(($num+1))
done
Si noti che la negazione della condizione di test [ $num -le 10 ]; è [$num -gt 10];
Ulteriori informazioni sul loop negli script bash
Ora che hai familiarità con i loop negli script bash
Stampa il contenuto di un array in bash
Se stai seguendo questa serie di tutorial dall'inizio, dovresti avere familiarità con gli array in bash.
I cicli For sono spesso la scelta più popolare quando si tratta di iterare sugli elementi dell'array.
Ad esempio, il seguente prime.sh lo script esegue un'iterazione e stampa ogni elemento nell'array principale:
#!/bin/bash
prime=(2 3 5 7 11 13 17 19 23 29)
for i in "${prime[@]}"; do
echo $i
done
Questo è l'output dello script prime.sh:
[email protected]:~$ ./prime.sh
2
3
5
7
11
13
17
19
23
29
Utilizzo di Interrompi e continua nei loop bash
A volte potresti voler uscire prematuramente da un ciclo o saltare un'iterazione del ciclo. Per fare ciò, puoi utilizzare le affermazioni break e continue.
L'istruzione break termina l'esecuzione di un ciclo e imposta il controllo del programma sul comando o istruzione successiva al ciclo.
Ad esempio, il seguente ciclo stampa solo i numeri da uno a tre:
for ((i=1;i<=10;i++)); do
echo $i
if [ $i -eq 3 ]; then
break
fi
done
Puoi anche utilizzare un continua istruzione per saltare un'iterazione del ciclo. Il ciclo continua e passa all'iterazione successiva ma i comandi dopo le istruzioni continue vengono saltati in quella particolare iterazione.
Ad esempio, il seguente odd.sh script stamperebbe solo i numeri dispari da uno a dieci poiché salta tutti i numeri pari:
#!/bin/bash
for ((i=0;i<=10;i++)); do
if [ $(($i % 2)) -ne 1 ]; then
continue
fi
echo $i
done
Ecco l'output che stampa i numeri dispari:
[email protected]:~$ ./odd.sh
1
3
5
7
9
Cicli infiniti in bash
Un ciclo infinito è un ciclo che continua a funzionare per sempre; questo accade quando la condizione di loop test è sempre vera.
Nella maggior parte dei casi, i cicli infiniti sono il prodotto di un errore logico umano.
Ad esempio, qualcuno che potrebbe voler creare un ciclo che stampi i numeri da 1 a 10 in ordine decrescente potrebbe finire per creare per errore il seguente ciclo infinito:
for ((i=10;i>0;i++)); do
echo $i
done
Il problema è che il ciclo continua ad incrementare la variabile i di 1 . Per risolverlo, devi cambiare i++ con io-- come segue:
for ((i=10;i>0;i--)); do
echo $i
done
In alcuni casi, potresti voler creare intenzionalmente loop infiniti per attendere che una condizione esterna venga soddisfatta sul sistema. Puoi facilmente creare un ciclo for infinito come segue:
for ((;;)); do
[COMMANDS]
done
Se invece vuoi creare un ciclo while infinito, puoi crearlo come segue:
while [ true ]; do
[COMMANDS]
done
Eccezionale! Questo ci porta alla fine di questo tutorial nella serie Bash Beginner. Spero che ti sia piaciuto girare in giro in bash!
Ora pratica il looping con alcuni semplici esercizi. Trovi anche la soluzione nel PDF qui sotto.
Bash Capitolo 8 Domande per la pratica Problemi e la loro soluzione per mettere in pratica ciò che hai appena imparato in questo capitolo Bash-Capitolo-8- Domande per la pratica-Linux-Handbook.pdf28 KB
Dai un'occhiata al prossimo capitolo mentre imparerai come riutilizzare il codice nei tuoi script bash creando funzioni.