Nella prima parte di questo tutorial di Bash Scripting, abbiamo discusso di come scrivere uno script Bash. Abbiamo esplorato i vari usi e gli scenari unici in cui gli script Bash possono tornare utili, fornendo un ottimo esempio di quanto possano essere incredibili.
In questa parte del tutorial, daremo un'occhiata al for
comando e il while
comando. Mostreremo come possiamo usare questi comandi per creare loop per iterare su una serie di valori.
Il ciclo For
In Linux, un ciclo è ciò che usiamo per eseguire ripetutamente i comandi a un intervallo specificato. I loop vengono utilizzati in un'ampia varietà di linguaggi di programmazione per lo stesso scopo.
Esistono diversi tipi di loop in Linux, ma in questa sezione dell'articolo ci concentreremo sul for
ciclo.
#!/bin/bash for y in a b c d w x y z > do > echo $y done
Come puoi vedere nello screenshot qui sopra, abbiamo attribuito la variabile "y" - che è solo un segnaposto privo di significato usato per il bene del comando - ad alcune lettere dell'alfabeto.
Abbiamo quindi passato quella variabile a echo
comando, ed è stato in grado di produrre le nostre lettere di seguito.
Esecuzione su valori semplici
Possiamo usare il for
comando in uno script Bash. Per fare ciò, dobbiamo prima creare un file di testo nel nostro terminale Linux. Puoi utilizzare il touch
comando per creare facilmente file di testo.
$ touch script
La sintassi sopra creerà un file di testo che chiameremo "script". Assicurati di creare il tuo file di testo utilizzando il .sh
estensione del file. Dopo aver creato script
, vorremo modificare il nostro vero script contenente il for
comando.
Possiamo raggiungere questo obiettivo eseguendo un paio di diversi comandi di modifica dei file di testo, come nano
comando e il vi
comando, ecc.
Ma ti consigliamo di utilizzare solo nano
, poiché è uno degli editor di testo dei comandi più semplici e facili da usare in Linux.
$ nano script
La sintassi sopra aprirà il nostro script
nell'editor di testo nano. Qui, vorremo digitare il nostro script.
Nota che questo file di testo deve contenere #!/bin/bash
, che informa lo script Bash su quale shell utilizzare, quindi è un componente fondamentale per creare correttamente uno script Bash.
#!/bin/bash for var in first second third fourth fifth; do echo The $var item done
Esecuzione su valori complessi
Nell'esempio precedente, abbiamo mostrato come usare for
comando per eseguire l'iterazione su valori semplici in uno script Bash creato dall'utente. La parola semplice qui si riferisce a valori che contengono solo una singola parola.
Ma a volte avrai un elenco che include, invece di quello che abbiamo visto nell'esempio precedente con "first" - qualcosa sulla falsariga di "the first", che contiene più di una parola per un singolo valore. Questi valori sono quelli che chiamiamo valori "complessi".
Se il tuo elenco ha questi valori complessi, dovrai farvi riferimento racchiudendoli tra virgolette, in modo che lo script capisca che si tratta solo di un valore.
#!/bin/bash for var in first "the second" "the third" "I’ll do it"; do echo "This is: $var" done
Sostituzione dei comandi
Possiamo anche usare la sostituzione dei comandi nel nostro for
comando nel nostro script Bash.
#!/bin/bash my_file="file01" for var in $(cat $my_file); do echo " $var" done
Qui abbiamo usato la sostituzione dei comandi con una subshell Bash, come si vede dall'uso del comando cat all'interno di $( )
; questo ci permette di usare l'output del cat
comando e ottieni il contenuto del file supponendo che ogni riga abbia una parola.
Ma se ci sono spazi in una di queste righe, ogni parola sarà considerata un campo. In questo caso, dovrai dire alla shell di trattare le nuove righe come un separatore invece degli spazi.
Il separatore di campo
Per impostazione predefinita, i seguenti caratteri sono considerati campi dalla shell Bash.
- Spazio
- Scheda
- nuova linea
Se il tuo testo include uno di questi caratteri, la shell presumerà che si tratti di un nuovo campo e dovrai modificare il separatore di campo interno o la variabile di ambiente IFS se devi utilizzare questi caratteri.
$ IFS=$’n’
La sintassi precedente farà sì che la shell Bash consideri le nuove righe come un separatore invece che come uno spazio.
#!/bin/bash file="/etc/passwd" IFS=$'n' for var in $(cat $file); do echo " $var" done
Puoi anche assegnare il separatore di campo ai due punti con IFS
come mostrato di seguito.
$ IFS=:
Abbastanza fantastico, eh?
Esecuzione su file di directory
Puoi anche usare il for
loop in uno script Bash per elencare i file nella tua home directory.
#!/bin/bash for obj in /home/ubuntu/*; do if [ -d "$obj" ]; then echo "$obj is a folder" elif [ -f "$obj" ]; then echo "$obj is a file" fi done
Questo processo richiede l'utilizzo di if
istruzione per controllare file e cartelle. Ma questo non dovrebbe rappresentare un grosso problema per te se hai letto il post precedente. Ma se per caso hai bisogno di un aggiornamento, ti consiglio di rivederlo.
Abbiamo utilizzato un carattere jolly chiamato asterisco (*) nel nostro script Bash che contiene un for
loop che ci permette di elencare i file e le cartelle nella nostra home directory. In Bash scripting, questo processo è chiamato "globbing di file .” File globbing significa tutti i file esistenti con un nome.
Nota che le variabili nel nostro if
istruzione sono scritti tra virgolette perché i nomi di file o cartelle possono contenere spazi. Se avessimo omesso questo passaggio, avremmo potuto non essere in grado di elencare tutti i file e le directory.
Esegui l'iterazione sulle righe del file
Possiamo usare il for
ciclo in uno script Bash per scorrere il contenuto del file:
#!/bin/bash IFS=$'n' for text in $(cat /etc/passwd); do echo "This line $text ++ contains" IFS=: for field in $text; do echo " $field" done done
Qui abbiamo due cicli, il primo ciclo itera sulle righe del file e il separatore è la nuova riga, la seconda iterazione è sulle parole sulla riga stessa e il separatore sono i due punti:
dati del file
Puoi applicare questa idea quando hai un CSV o qualsiasi file di valori separati da virgole. L'idea è la stessa; devi solo cambiare il separatore in base alle tue esigenze.
Per loop C-Style
Se hai familiarità con il linguaggio C, potresti notare che c'è qualcosa di strano in for
loop in Linux a volte.
Questo perché esistono due modi per scrivere for
anelli; la modalità standard di Linux, di cui abbiamo già parlato all'inizio di questo tutorial, e la modalità "C-style".
for (var= 0; var < 5; var++) { printf(“number is %dn”, var); }
La sintassi sopra è per for
ciclo scritto in C. Lo stile C for
loop in Linux è scritto in modo molto simile a questo con alcune piccole modifiche, che possono essere osservate di seguito.
for (( variabile =inizio; condizione; passaggio di iterazione))
for (( var = 1; var < 5; var++ ))
Per aiutare a dipingere meglio l'immagine, includeremo uno script Bash di esempio utilizzando lo stile C for
loop nel nostro terminale Linux.
#!/bin/bash for ((var = 1; var <= 10; var++)); do echo "number is $var" done
Mettilo nel nostro file di testo e accendilo.
Il comando Continua
La Bash continue
command ignora i comandi all'interno del ciclo esterno per l'iterazione corrente e dà il controllo a quella successiva. Puoi usare questo comando per interrompere l'esecuzione dei comandi rimanenti all'interno di un ciclo senza uscire dal ciclo.
Nei prossimi due esempi, analizzeremo come questo comando può essere utilizzato nei cicli di scripting Bash in Linux.
Il comando di rottura
Puoi usare il comando break per uscire da qualsiasi ciclo, come i cicli while e until.
#!/bin/bash for number in 10 11 12 13 14 15; do if [ $number -eq 14 ]; then break fi echo "Number: $number" done
Il ciclo viene eseguito fino a raggiungere 14, quindi il comando esce dal ciclo.
Vedremo altri esempi di questo comando un po' più avanti.
Il ciclo While
Il ciclo for non è l'unico modo per eseguire il ciclo negli script Bash. Il while
loop fa lo stesso lavoro, ma verifica una condizione prima di ogni iterazione. La struttura del while
loop può essere visto di seguito.
while [ condition ] do commands done
Forniremo un esempio con uno script Bash.
#!/bin/bash number=10 while [ $number -gt 4 ]; do echo $number number=$(($number - 1)) done
Il modo in cui funziona questo script Bash è semplice; inizia con il while
comando per verificare se il numero è maggiore di zero, quindi eseguirà il ciclo e il valore del numero verrà diminuito ogni volta di 1. Ad ogni iterazione del ciclo, lo script stamperà il valore del numero. Il ciclo verrà eseguito finché quel numero non raggiunge 0.
Loop nidificati
Puoi creare loop all'interno di altri loop, come il while
ciclo per esempio. Questi cicli all'interno di un ciclo sono chiamati cicli annidati. Analizzeremo questi aspetti esaminando prima come creare un for
nidificato ciclo nel seguente esempio.
Cicli for multipli (nidificati per)
Negli esempi precedenti finora in questo tutorial, abbiamo mostrato come creare for
loop in uno script Bash in Linux. Ma esiste anche qualcosa che chiamiamo for
annidato loop. Questi sono loop all'interno di altri loop, o semplicemente loop multipli, per dirla semplicemente.
Ti mostreremo un semplice esempio di come appare, insieme a un breve esame e una descrizione in basso.
for y in a b c d e f do for u in a b c d e f do echo "$y$u" done done
Come puoi vedere nello screenshot qui sopra, l'output che riceviamo eseguendo il nostro script nel terminale della riga di comando di Linux è il seguente:il nostro testo di esempio in ogni for
loop è “a b c d e f”.
Quello che fa il nostro script è fare eco al testo nel ciclo esterno insieme al testo del ciclo interno.
Lo script continua a produrre il primo campo (in questo caso gli spazi, lo spiegheremo un po' più avanti) del testo nel ciclo esterno fino a quando non sono stati emessi tutti i campi contenuti nel ciclo interno.
Al completamento dell'output del ciclo interno, il nostro script Bash inizierà quindi a produrre il seguente campo di testo nel ciclo esterno.
L'intero processo verrà ripetuto fino a quando ogni campo di ogni ciclo non sarà stato completamente stampato nell'output nel tuo terminale Linux.
Ciclo while multiplo (nidificato while)
Come il for
annidato cicli di comando, esiste anche while
nidificato cicli di comando. Funzionano esattamente come i cicli annidati per for
comando; un ciclo all'interno di un altro ciclo.
La sintassi seguente avrà una sorprendente somiglianza con il normale while
loop, come la struttura di un while
annidato loop è semplicemente una forma espansa della base while
loop, che può essere osservato nella sintassi seguente.
while [condition] do statements1 statements2 while [condition] do continue done statements3 done
La sintassi sopra eseguirà attività specificate fino a quando le condizioni che hai selezionato non saranno soddisfatte. Questo è ciò che viene chiamato un ciclo. Ma poiché il ciclo nell'esempio sopra è nidificato, ciò significa che una delle attività che abbiamo menzionato sopra è un altro ciclo stesso.
Mentre Avanti
Abbiamo mostrato come il while
loop e il for
loop può essere molto utile per eseguire processi complessi usando gli script Bash in Linux.
Ma a volte, per vari motivi, dovrai eliminare uno dei loop nel tuo script Bash. Questo scenario, per quanto brutale possa sembrare, si verifica spesso nel lavoro di amministrazione del sistema. Quindi, potresti voler familiarizzare con questo concetto.
Nella shell Bash, il break
comando e il comando continue
command può fornire gli strumenti necessari per controllare il flusso dei tuoi cicli di script Bash.
Mostreremo come funzionano questi comandi individualmente con un paio di esempi di seguito.
La sintassi per l'utilizzo di brea
comando per uscire da un while
il ciclo è il seguente:
$ while [ condition ] do commands continue done
Il continue
comando break
i comandi funzionano in modo molto simile e possono essere considerati opposti l'uno all'altro; il continue
il comando funziona esattamente come break
comando, solo che continua il ciclo invece di ucciderlo.
Esci durante il ciclo
La break
comando uccide il ciclo corrente e dà il controllo al comando successivo che segue quel ciclo. Puoi utilizzare questo processo per uscire da loop come for
,while
, ecc. La sintassi di break
il comando è il seguente:
$ while [ condition ] do commands break done
Ma come accennato in precedenza, entrambi i continue
comando e il break
il comando può essere utilizzato per altri cicli di script Bash oltre a while
ciclo continuo. Mostreremo come usarli nel for
ciclo.
Esci dal ciclo
Puoi usare questi comandi di controllo del ciclo in un for
ciclo continuo. Useremo il break
comando per uscire da for
ciclo nel nostro script Bash.
#!/bin/bash for number in 10 11 12 13 14 15; do if [ $number -eq 14 ]; then break fi echo "Number: $number" done
Il for
il ciclo viene eseguito finché non raggiunge il numero specificato nello script bash, che è 14. Al raggiungimento del numero specificato, il break
il comando uscirà da for
ciclo.
Dichiarazione Break If
Abbiamo appena mostrato come possiamo usare break
comando per uscire da for
loop, ma possiamo anche usare questo comando per uscire da if
istruzione all'interno di questi cicli di script Bash.
i=0 while [[ $i -lt 10 ]] do echo "Number: $i" ((i++)) if [[ $i -eq 5 ]]; then break fi done
Continua dichiarazione
Facciamo la stessa cosa che abbiamo fatto nell'esempio precedente con continue
comando come abbiamo fatto con il break
comando in un while
ciclo in uno script Bash.
i=0 while [[ $i -lt 10 ]]; do ((i++)) if [[ "$i" == '5' ]]; then continue fi echo "Number: $i" done
Pensieri conclusivi
Spero che tu abbia imparato una o due cose nuove. O, almeno, spero che tu sia stato in grado di rivedere ciò che già sai. Le mie ultime parole oggi per te sarebbero:continuare a leggere e fare pratica.
Grazie.