Benvenuto nella quarta parte della serie di tutorial sugli script di shell di HowtoForge (fai clic qui per leggere la parte 1, la parte 2 e la parte 3 del tutorial). In questa parte, tratteremo le diverse strutture di controllo della ripetizione della shell bash e come utilizzare ciascuna struttura fornendo alcuni esempi. Iniziamo.
Introduzione
La struttura di controllo della ripetizione, nota anche come struttura di controllo del ciclo, è un tipo di struttura di controllo nei linguaggi di programmazione che viene utilizzata per semplificare attività ripetitive o ricorsive. Le istruzioni di ciclo ottimizzano qualsiasi codice fornendo un modo per ridurre al minimo il codice, semplificando la risoluzione dei problemi rispetto al codice non strutturato che fornisce lo stesso output. Ci sono tre tipi di istruzioni di loop che la shell bash supporta:i loop for, while e till.
Cicli For
Il ciclo for è un'istruzione di ciclo che utilizza la parola chiave for per dichiarare un'istruzione ripetitiva. bash supporta diverse sintassi per l'istruzione ciclo for:
Sintassi 1:struttura For-in
for <varName> in <list>
do
#### your statement here
done
Questa sintassi inizia con la parola chiave for, quindi segue il nome di una variabile, la parola chiave in e l'elenco dei possibili valori per la variabile. Ogni valore nell'elenco sarà separato da uno spazio e l'inizio delle righe di codice che verranno ripetute è definito in do e termina con una parola chiave done.
Creiamo una semplice istruzione for loop che consentirà all'utente di inserire 5 valori e ottenere la somma dei numeri:
#!/bin/bash
result=0;
input=0;
for var in 1 2 3 4 5
do
printf "Input integer %d : " $var
read input
result=$((result+input))
done
echo "the result is " $result
In questo esempio, la variabile var funge da contatore del nostro ciclo. Il suo valore è definito nell'elenco di numeri dopo la parola chiave in e la shell cambia i valori della variabile var dopo ogni esecuzione del ciclo nell'istruzione di ciclo. Poiché nella nostra lista sono presenti solo cinque valori interi, la shell eseguirà i codici all'interno della nostra istruzione di ciclo solo per cinque volte.
Sintassi 2:istruzione per il ciclo con valori di elenco di stringhe
Puoi anche dichiarare una variabile che sarà valida per l'elenco degli articoli per il tuo contatore. Ad esempio, considera il seguente codice:
#!/bin/bash
list="var1 var2 var3 var4"
var=""
mkdir sample
cd sample
echo creating the "directories...."
for var in $list
do
mkdir $var
done
La riga list="var1 var2 var3 var4" definisce i valori della variabile list. È stato quindi assegnato a var nella riga per var in $list e, infine, le directory vengono quindi create nella riga mkdir $var.
Sintassi 3:istruzione For loop con list as a file
Puoi anche recuperare un elenco da un file esistente da utilizzare nell'istruzione per il ciclo invece di dichiararlo all'interno del tuo codice usando il comando cat. Ad esempio, apri il tuo editor di testo preferito, quindi elenca almeno cinque nomi di directory.
Quindi apri una nuova scheda nello stesso editor di testo e crea un nuovo script. Questo script dovrebbe essere salvato nella stessa directory in cui è stato salvato l'elenco delle directory che hai creato in precedenza.
#!/bin/bash
dirList=$(cat list)
echo "creating directories...."
for var in $dirList
do
mkdir $var
done
Questo esempio diventa utile quando devi creare centinaia di directory nel tuo computer Linux, non credi?
Sintassi 4:sintassi simile a C
for((initialization; boolean_test; increment/decrement))
do
#### your code goes here
done
Forse, la struttura più familiare del ciclo for che supporta la shell è la struttura simile a C. Il ciclo inizia con l'inizializzazione della variabile counter e poi la shell valuta l'espressione booleana dichiarata dopo l'inizializzazione. Se il risultato dell'espressione booleana è vero, la shell eseguirà l'insieme di istruzioni all'interno della clausola do, altrimenti termina l'istruzione di ciclo e procede alla riga dopo la parola chiave done. La shell procederà all'iterazione successiva attraverso l'istruzione di incremento o decremento dichiarata dopo il test booleano. A titolo di esempio, ricostruiamo il nostro primo esempio utilizzando questa struttura.
#!/bin/bash
result=0
input=0
for((var=1;var<=5;var++))
do
printf "Input integer %d : " $var
read input
result=$((result+input))
done
echo $result
Dichiarazione durante il ciclo
L'istruzione while è un tipo di struttura ripetitiva in bash che utilizza la parola chiave while. A differenza della sintassi di tipo C della struttura di ciclo for, la struttura di controllo ripetitiva while separa l'inizializzazione, il test booleano e l'istruzione di incremento/decremento.
Sintassi 1:While Structure con istruzioni condizionali basate su simboli aritmetici
<initialization>
while(condition)
do
###your code goes here
<increment/decrement>
done
Per essere in grado di differenziare while dalle altre istruzioni in loop, costruiamo il nostro primo esempio per l'istruzione while.
#!/bin/bash
result=0
input=0
var=1
while((var <= 5))
do
printf "Input integer %d : " $var
read input
result=$((result+input))
var=$((var+1))
done
echo "the result is " $result
Guardando il nostro esempio, l'istruzione while inizia con un'inizializzazione della nostra variabile contatore var. Successivamente, il test booleano viene dichiarato dopo la parola chiave while e l'insieme di istruzioni da ripetere verrà dichiarato all'interno delle istruzioni do e done. Nelle istruzioni while, l'interprete avvierà ed eseguirà la ripetizione dei codici solo se il risultato del test booleano è vero. D'altra parte, l'istruzione di looping will termina l'iterazione dei codici solo quando l'espressione booleana risulta falsa.
Sintassi 2:dichiarazione While Looping con istruzione condizionale basata su mnemonico
<initialization>
while [ <condition> ]
do
####your code goes here
<increment/decrement>
done
Puoi anche dichiarare un'istruzione condizionale basata su mnemonico all'interno di un'istruzione del ciclo while. Per la dichiarazione verrà utilizzata una parentesi quadra al posto delle parentesi. (Esamina le istruzioni condizionali basate sul mnemonico qui ) Ad esempio:
#!/bin/bash
var=1;
while [ $var -le 5 ]
do
printf "Input integer %d : " $var
read input
result=$((result+input))
var=$((var+1))
done
echo "the result is " $result
Sintassi 3:istruzione While Looping con istruzione condizionale basata su file
while read <variable_name>
do
####your code goes here
done <<path to the text file>
Proprio come abbiamo fatto nell'istruzione di ciclo for, puoi anche aprire un file di testo e associarlo nell'istruzione di ciclo while. Ad esempio:
#!/bin/bash
mkdir sample2
cd sample2
echo "creating directories..."
while read var
do
mkdir $var
done<list
In questo esempio, ho riciclato l'elenco che abbiamo creato qualche tempo fa e ho creato un nuovo script nella stessa directory. Nota che se il tuo file di testo si trova in una directory diversa, devi fornire il percorso esatto del file dopo il simbolo <.
Fino alla dichiarazione di ciclo
Un altro tipo di istruzione di loop supportata da bash è la struttura till. L'istruzione until esegue tutti i comandi all'interno del ciclo finché l'espressione booleana non risulta falsa. È l'esatto opposto dell'istruzione while.
Sintassi 1:ciclo Until con istruzione condizionale basata su simboli aritmetici
until ((<conditional_statement>))
do
####set of commands
done
Facciamo un esempio:
result=0
input=0
var=1
until((var > 5))
do
printf "Input integer %d : " $var
read input
result=$((result+input))
var=$((var+1))
done
echo "the result is " $result
Sintassi 2:istruzione Until Looping con istruzione condizionale basata sul mnemonico
<initialization>
until [ <condition> ]
do
####your code goes here
<increment/decrement>
done
Poiché l'istruzione until è esattamente l'opposto dell'istruzione di ciclo while, puoi anche dichiarare un'istruzione condizionale basata su mnemonico nella struttura fino. Tuttavia, per terminare devi dichiarare un'istruzione condizionale opposta, ovvero fare in modo che l'istruzione condizionale valuti falsa.
!/bin/bash
result=0
input=0
var=1
until [ $var -gt 5 ]
do
printf "Input integer %d : " $var
read input
result=$((result+input))
var=$((var+1))
done
echo "the result is " $result
Conclusione
Questa parte del tutorial copre le tre strutture di loop supportate da bash:l'istruzione di loop for, while e till. Ognuna di queste affermazioni ha struttura, utilizzo e vantaggi diversi. Bash supporta diverse strutture, fornendo più scelte ai programmatori e, quindi, semplificando la codificazione degli script di shell.