Questo articolo continua la serie di articoli di Bash e si concentra sulle iterazioni. I loop in Bash sono utili per qualsiasi amministratore di sistema e programmatore. I costrutti di loop in qualsiasi linguaggio di scripting consentono di eseguire più comandi e continuare a rieseguirli fino al raggiungimento di una situazione specifica. In parole povere, i loop sono utili per automatizzare le attività ripetitive. Esistono tre costrutti di ciclo in un linguaggio di scripting della shell:
- Mentre -ciclo.
- Per -ciclo.
- Fino a -ciclo.
A per -loop è un'istruzione di iterazione in linguaggio Bash utilizzata per eseguire una serie di azioni. Puoi usarlo su un prompt della shell o all'interno di uno script della shell stesso. Opera su elenchi di elementi e ripete una serie di comandi per ogni elemento nell'elenco.
Sintassi di base
La sintassi di base è mostrata di seguito:
for item in [LIST]
do
COMMANDS
done
Dove:
- ELENCO è una serie di stringhe o numeri separati da spazi.
- COMANDI è un insieme di comandi che viene eseguito su un elenco di elementi.
- per , in , fai, e fatto sono parole chiave della sintassi del ciclo.
- oggetto è un nome di variabile Bash utilizzato per ottenere l'accesso all'elemento dall'elenco.
Esecuzione dell'iterazione sui numeri
Puoi utilizzare questo tipo di ciclo per scorrere una serie di numeri o un elenco numerico fino all'esaurimento dell'elenco.
Nell'esempio seguente, sperimentiamo i numeri 1 2 3 4 5 .
#!/bin/bash
for var in 1 2 3 4 5
do
echo "Number is $var"
done
Dovresti ottenere il seguente output:
Number is 1
Number is 2
Number is 3
Number is 4
Number is 5
Nell'esempio sopra, per -loop prende ogni elemento dall'elenco, lo memorizza nella variabile var ed esegue i comandi tra do e fatto .
È inoltre possibile specificare un intervallo di numeri definendo l'intervallo di valori.
Nell'esempio seguente, ripetiamo tutti i numeri compresi tra 10 e 15 .
#!/bin/bash
for var in {10..15}
do
echo "Number is $var"
done
Dovresti ottenere il seguente output:
Number is 10
Number is 11
Number is 12
Number is 13
Number is 14
Number is 15
Quando utilizzi un intervallo specifico all'interno del ciclo, puoi anche specificare un incremento per incrementare ciascun numero.
Nell'esempio seguente, ripetiamo un intervallo di numeri da 0 a 10 e incrementa ciascun numero di 2 :
#!/bin/bash
for var in {0..10..2}
do
echo "Number is $var"
done
Dovresti ottenere il seguente output:
Number is 0
Number is 2
Number is 4
Number is 6
Number is 8
Number is 10
Esecuzione dell'iterazione sulle stringhe
Puoi anche utilizzare loop per scorrere un elenco di stringhe.
Nell'esempio seguente, ripetiamo un elenco di stringhe una per una:
#!/bin/bash
for month in Jan Feb Mar Apr May Jun
do
echo "Month is $month"
done
Dovresti ottenere il seguente output:
Month is Jan
Month is Feb
Month is Mar
Month is Apr
Month is May
Month is Jun
Esecuzione dell'iterazione su un array
Nell'esempio seguente, ripetiamo tutti gli elementi in CARS matrice:
#!/bin/bash
CARS=('Maruti' 'Toyota' 'BMW' 'Tata' 'Datsun')
for car in "${CARS[@]}"; do
echo "Car: $car"
done
Dovresti ottenere il seguente output:
Car: Maruti
Car: Toyota
Car: BMW
Car: Tata
Car: Datsun
Nel seguente esempio, per -loops itera tutti gli elementi in un array di giorni feriali.
#!/bin/bash
i=1
weekdays="Mon Tue Wed Thu Fri"
for day in $weekdays
do
echo "Weekday $((i++)): $day"
done
Dovresti ottenere il seguente output:
Weekday 1: Mon
Weekday 2: Tue
Weekday 3: Wed
Weekday 4: Thu
Weekday 5: Fri
Cicli infiniti
Puoi creare un ciclo infinito usando le espressioni vuote.
#!/bin/bash
for (( ; ; ))
do
echo "Infinite Loops [ press CTRL+C to stop]"
done
Dovresti ottenere il seguente output:
Infinite Loops [ press CTRL+C to stop]
Infinite Loops [ press CTRL+C to stop]
Infinite Loops [ press CTRL+C to stop]
Infinite Loops [ press CTRL+C to stop]
Infinite Loops [ press CTRL+C to stop]
Infinite Loops [ press CTRL+C to stop]
Infinite Loops [ press CTRL+C to stop]
Puoi premere CRTL+C per fermare il ciclo infinito.
Dichiarazione di interruzione
Puoi utilizzare la pausa per uscire prima dal ciclo.
Nell'esempio seguente, ripetiamo i numeri compresi tra 20 a 30 . Useremo se -istruzione per uscire dal ciclo una volta che l'elemento correntemente ripetuto è uguale a 27 .
#!/bin/bash
for var in {20..30}
do
if [[ "$var" == '27' ]]; then
break
fi
echo "Number is: $var"
done
Dovresti ottenere il seguente output:
Number is: 20
Number is: 21
Number is: 22
Number is: 23
Number is: 24
Number is: 25
Number is: 26
Continua istruzione
L'istruzione continue viene utilizzata all'interno dei loop. Quando viene rilevata un'istruzione continue all'interno di un ciclo, il flusso di controllo salta all'inizio del ciclo per l'iterazione successiva, saltando l'esecuzione delle istruzioni all'interno del corpo del ciclo per l'iterazione corrente.
Nell'esempio seguente, ripetiamo i numeri compresi tra 10 a 15 . Quando l'elemento correntemente ripetuto è uguale a 13 , l'istruzione continue interromperà l'esecuzione, tornerà all'inizio del ciclo e continuerà con l'iterazione successiva:
#!/bin/bash
for var in {10..15}
do
if [[ "$var" == '13' ]]; then
continue
fi
echo "Number is: $var"
done
Dovresti ottenere il seguente output:
Number is: 10
Number is: 11
Number is: 12
Number is: 14
Number is: 15
Esempi avanzati
Rinomina estensione file
Questa sezione ti mostrerà come modificare l'estensione di tutti i file nella directory.
L'esempio seguente cambierà l'estensione di tutti i file nella directory corrente da .php in .html .
#!/bin/bash
for file in *.php; do
mv "$file" "${file%.php}.html"
echo $file is renamed to "${file%.php}.html"
done
Dovresti ottenere il seguente output:
admin.php is converted to admin.html
ajax.php is converted to ajax.html
composer.php is converted to composer.html
index.php is converted to index.html
login.php is converted to login.html
Visualizza il numero di volte di seguito
In questo esempio, visualizzeremo l'ora attuale del sistema ogni 2 secondi.
#!/bin/bash
for now in {1..5}
do
date
sleep 2
done
Dovresti ottenere il seguente output:
Fri Dec 4 12:19:10 IST 2020
Fri Dec 4 12:19:12 IST 2020
Fri Dec 4 12:19:14 IST 2020
Fri Dec 4 12:19:16 IST 2020
Fri Dec 4 12:19:18 IST 2020
Annulla file tar multipli
Puoi eseguire la stessa azione su tutti i file con la stessa estensione. Ad esempio, decomprimiamo più file nella directory.
L'esempio seguente estrarrà tutti i file tar che si trovano all'interno della directory corrente:
#!/bin/bash
for var in *.tar
do
echo "Processing $var..."
tar -xf "$var"
done
Esegui il ping di più server
È possibile utilizzare l'espressione loop per eseguire il ping di diversi server dall'elenco.
Innanzitutto, crea un file chiamato domain.txt e aggiungi tutti i server a questo file, come mostrato di seguito:
cat domain.txt
Aggiungi le seguenti righe:
google.com
facebook.com
yahoo.com
wordpress.com
Ora, eseguiamo il ping di tutti i server elencati nel file domain.txt come mostrato di seguito:
#!/bin/bash
for var in $(cat domain.txt)
do
ping -c 1 "$var"
done
Dovresti ottenere il seguente output:
PING google.com (216.58.203.14) 56(84) bytes of data.
64 bytes from hkg12s09-in-f14.1e100.net (216.58.203.14): icmp_seq=1 ttl=117 time=119 ms
--- google.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 119.469/119.469/119.469/0.000 ms
PING facebook.com (69.171.250.35) 56(84) bytes of data.
64 bytes from edge-star-mini-shv-01-any2.facebook.com (69.171.250.35): icmp_seq=1 ttl=56 time=43.9 ms
--- facebook.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 43.994/43.994/43.994/0.000 ms
PING yahoo.com (74.6.231.21) 56(84) bytes of data.
64 bytes from media-router-fp74.prod.media.vip.ne1.yahoo.com (74.6.231.21): icmp_seq=1 ttl=51 time=371 ms
--- yahoo.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 371.135/371.135/371.135/0.000 ms
PING wordpress.com (192.0.78.9) 56(84) bytes of data.
64 bytes from 192.0.78.9: icmp_seq=1 ttl=56 time=40.1 ms
--- wordpress.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 40.162/40.162/40.162/0.000 ms
Elenca file con condizioni
Ecco un esempio che mostra come elencare tutti i file all'interno di una directory specifica che soddisfano condizioni specifiche.
Ad esempio, elenca tutti i .conf file all'interno di /etc directory che inizia con a , b , c o d lettere:
#!/bin/bash
i=1
for file in /etc/[abcd]*.conf
do
echo "File $((i++)) : $file"
done
Dovresti ottenere l'elenco di tutti i file nel seguente output:
File 1 : /etc/adduser.conf
File 2 : /etc/apg.conf
File 3 : /etc/blkid.conf
File 4 : /etc/brltty.conf
File 5 : /etc/ca-certificates.conf
File 6 : /etc/colord.conf
File 7 : /etc/debconf.conf
File 8 : /etc/deluser.conf
Riepilogo
In questo articolo abbiamo trattato vari esempi di utilizzo di Bash per -cicli. Ci auguriamo che ora tu abbia un'idea di come automatizzare le tue attività quotidiane. Se l'articolo è stato utile, aiutaci a diffonderlo nel mondo.