GNU/Linux >> Linux Esercitazione >  >> Linux

Bash For Loop – La guida più pratica

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.

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.
  • perinfai,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 dofatto .

È inoltre possibile specificare un intervallo di numeri definendo l'intervallo di valori.

Nell'esempio seguente, ripetiamo tutti i numeri compresi tra 1015 .

#!/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 010 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 2030 . 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 1015 . 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 abcd 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.


Linux
  1. Una guida al terminale Linux per principianti

  2. Parallelizzare un Bash For Loop?

  3. Limite pratico al numero di istantanee Btrfs?

  4. Il Bash '?

  5. Tieniti aggiornato - Bash For, While, Until Esempi di loop

L'elenco delle scorciatoie da tastiera utili di Bash

Bash Scripting – For Loop spiegato con esempi

Una guida pratica per il comando chroot in Linux

Comprendere il ciclo for negli script della shell

Il comando apt:una guida pratica all'uso

Il ciclo Bash FOR spiegato e semplificato