GNU/Linux >> Linux Esercitazione >  >> Linux

Bash Beginner Series #8:Loop in Bash

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

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.


Linux
  1. Come scrivere un ciclo in Bash

  2. Scripting Linux:3 istruzioni per i cicli while in Bash

  3. Bash Beginner Series #9:Utilizzo delle funzioni in Bash

  4. RHCE Ansible Series #5:Ansible Loops

  5. Esempi di Bash for loop

Bash Beginner Series #5:Utilizzo di operatori aritmetici negli script Bash

Bash Beginner Series #4:Utilizzo di array in Bash

Bash Beginner Series #3:Passare argomenti agli script Bash

Bash Beginner Series #7:Decision Making With If Else e Case Statements

Bash Beginner Series #6:Operazioni con le stringhe in Bash

Bash Beginner Series #10:Automazione con Bash