SlideShare a Scribd company logo
1 of 98
Download to read offline
SHELL SCRIPTING
Matteo Collica
v29/06/2020 https://www.linkedin.com/in/MatteoCollica/
0.
Indice dei contenuti
2
1 - Introduzione
2 - Primi passi
3 - Variabili
4 - Array
5 - Aritmetica
6 - Test
7 - Costrutti condizionali
8 - Cicli iterativi
9 - Funzioni
10 - Quoting
11 - Terminare uno script
12 - Debugging
Matteo Collica - Shell Scripting (#!/bin/bash) - Indice
Matteo Collica - Shell Scripting (#!/bin/bash) - Lezione n°1
1.
Introduzione
● Shell
● Comandi della shell
● Bash script
● Shell scripting
● Perché programmare la shell?
3
Matteo Collica - Shell Scripting (#!/bin/bash) - Introduzione
shell
Interprete di comandi che permette
all’utente di comunicare col sistema
operativo attraverso una serie di
funzioni predefinite, o di eseguire
programmi e script.
4
Matteo Collica - Shell Scripting (#!/bin/bash) - Introduzione5
Matteo Collica - Shell Scripting (#!/bin/bash) - Introduzione
In questa presentazione esploreremo le basi
dello scripting di shell, e per farlo ci baseremo
sulla shell Linux più diffusa, cioè Bash.
6
Matteo Collica - Shell Scripting (#!/bin/bash) - Introduzione7
Comandi della shell
Nella shell di Linux (Bash) possiamo eseguire tre distinti elementi:
❏ Oggetti eseguibili: comandi di shell (come ad esempio ls) per cui
esiste un relativo file eseguibile nelle directory predefinite di sistema;
❏ Comandi built-in: comandi incorporati nella shell (come cd, echo);
❏ Script: programmi scritti in linguaggio bash script che possono
contenere sia comandi built-in che oggetti eseguibili.
Matteo Collica - Shell Scripting (#!/bin/bash) - Introduzione8
Bash script
Bash offre una sintassi ricca, tale da
permettere la creazione e l’esecuzione di
sequenze di comandi della shell,
tecnicamente chiamate Bash script.
Bash Script
Script
File testuale che può contenere un elenco di
comandi, così come variabili, funzioni,
strutture di controllo di flusso e tutti gli altri
costrutti tipici della programmazione.
Matteo Collica - Shell Scripting (#!/bin/bash) - Introduzione
Shell Scripting
In definitiva, un Bash script è uno script
scritto nel linguaggio di scripting nativo
messo a disposizione dalla shell Bash.
L’arte di creare e modificare gli script della
shell prende il nome di Shell Scripting.
9
Matteo Collica - Shell Scripting (#!/bin/bash) - Introduzione
Usi comuni
I bash script vengono comunemente usati
per automatizzare molte attività di
amministrazione di sistema, come l’analisi
dei log e il backup dei dischi. Sono anche
molto usati come script di installazione
per programmi complessi.
Perché Programmare la Shell?
L’Importanza di saperlo fare
Gli script permettono di risolvere problemi
complessi con istruzioni semplici. Ad esempio,
solo una riga per richiamare un programma
esterno; al tempo stesso, la shell ci mette a
disposizione pressoché tutta la potenza di un
linguaggio di programmazione completo.
10
Matteo Collica - Shell Scripting (#!/bin/bash) - Lezione n°2
2.
Primi passi
● Sintassi del linguaggio
● Eseguire uno script
11
Matteo Collica - Shell Scripting (#!/bin/bash) - Primi passi12
La prima riga dello script indica al sistema che il file deve essere
eseguito da /bin/bash, che corrisponde al percorso standard
dell’interprete BASH su qualsiasi sistema basato su Unix.
Sintassi del Linguaggio
Matteo Collica - Shell Scripting (#!/bin/bash) - Primi passi
Eseguire uno Script
chmod +rx ./script.sh
13
Matteo Collica - Shell Scripting (#!/bin/bash) - Primi passi
Eseguire un Bash Script
❖ $sh <nome script> ignora le estensioni specifiche di Bash e, di
conseguenza, potrebbe compromettere l’esecuzione.
➢ Una possibile alternativa è $bash.
❖ È necessario il permesso di lettura perché la shell per poter eseguire
uno script deve essere prima in grado di leggere il file che lo contiene.
❖ È necessario specificare il percorso completo (se non fa parte di
quelli listati nella variabile $PATH) di uno script per eseguirlo.
➢ Esempio - per la directory corrente: ./<nomescript>.
14
Matteo Collica - Shell Scripting (#!/bin/bash) - Primi passi15
3.
Variabili● Sintassi
● Tipizzazione
● Input
● Valore predefinito
● Variabili predefinite
● Parametri posizionali
16 Matteo Collica - Shell Scripting (#!/bin/bash) - Lezione n°3
Matteo Collica - Shell Scripting (#!/bin/bash) - Variabili
Variabili
Esistono due diversi tipi di variabili:
● Variabili locali: vengono dichiarate dal programmatore ed utilizzate
all’interno dello script, le chiameremo per semplicità solo “variabili”;
● Variabili predefinite: sono definite dal sistema ed utilizzabili per
ottenere informazioni, un esempio è $PATH che contiene i percorsi
delle directory in cui il sistema cerca i file eseguibili, ne vedremo
alcune particolarmente utili per gli script qualche slide più avanti.
17
18
Per dichiarare una variabile è sufficiente assegnarle un valore
Per assegnare un valore ad una variabile: <nome>=<valore>
Per leggere il valore di una variabile: $<nome>
Sintassi
Matteo Collica - Shell Scripting (#!/bin/bash) - Variabili
19 Matteo Collica - Shell Scripting (#!/bin/bash) - Variabili
Matteo Collica - Shell Scripting (#!/bin/bash) - Variabili
Bash – come Perl o PHP – è un
linguaggio a tipizzazione dinamica:
le variabili non possiedono un tipo
vero e proprio, ma vengono
“convertite” in base al contesto.
Tipizzazione
Qualunque valore viene di fatto
memorizzato come stringa, ma
funzioni che richiedono numeri in
input possono comunque
trattarle come tali.
20
21 Matteo Collica - Shell Scripting (#!/bin/bash) - Variabili
22
Il builtin read legge una riga dallo standard
input e la memorizza nella variabile fornita
come parametro
Input
Matteo Collica - Shell Scripting (#!/bin/bash) - Variabili
Matteo Collica - Shell Scripting (#!/bin/bash) - Variabili23
Valore Predefinito?
In Bash non è obbligatorio dichiarare le variabili. Se però si
cerca di leggere il contenuto di una variabile non dichiarata, si
otterrà semplicemente una stringa vuota, senza che venga
generato alcun messaggio di errore.
Matteo Collica - Shell Scripting (#!/bin/bash) - Variabili
Valore Predefinito
È possibile specificare un valore da utilizzare nel caso in cui la
variabile non sia stata dichiarata per mezzo dell’operatore “:-”
24
Matteo Collica - Shell Scripting (#!/bin/bash) - Variabili25
Matteo Collica - Shell Scripting (#!/bin/bash) - Variabili
Valore Predefinito
Esiste anche l’operatore ":=", che imposta un
valore alla variabile se questa non è definita
26
Matteo Collica - Shell Scripting (#!/bin/bash) - Variabili
Argomenti
Gli stessi script Bash sono programmi che
possono essere eseguiti; anch’essi perciò
possono accettare degli argomenti.
Variabili Predefinite
Parametri posizionali
Gli argomenti sono disponibili in un
programma come parametri posizionali,
simili alle variabili ma identificati da
numeri ($1, $2... etc).
27
Matteo Collica - Shell Scripting (#!/bin/bash) - Variabili28
I parametri posizionali successivi al nono ($9) invece
richiedono l’espansione con l’uso delle parentesi graffe; per
riferirsi al decimo parametro, ad esempio, si dovrà indicare
${10}, altrimenti $10 verrebbe interpretato come ${1}0.
Parametri Posizionali
Matteo Collica - Shell Scripting (#!/bin/bash) - Variabili29
Il numero di parametri posizionali è memorizzato in
$#, ed è possibile stampare una stringa contenente
tutti i parametri utilizzando la variabile predefinita $*
Parametri Posizionali
Matteo Collica - Shell Scripting (#!/bin/bash) - Variabili30
Altre Variabili Predefinite
$$
Memorizza il PID (Process IDentifier) della shell in
esecuzione. Spesso inclusa nei nomi dei file
temporanei generati da uno script, come
/tmp/script.$$, se più istanze dello script
possono essere eseguite allo stesso tempo.
$!
Corrisponde al PID dell’ultimo processo eseguito
in background. Utile per tenerne traccia mentre
questo continua a svolgere il proprio lavoro.
IFS
Internal Field Separator, rappresenta il carattere (o i
caratteri) che separa i diversi parametri fra di loro. Il
valore predefinito è ‘SPACE TAB NEWLINE’.
Alcune variabili utili per gli script
$? contiene lo stato di uscita dell’ultimo comando eseguito,
consiste in un valore intero positivo compreso tra 0 e 255;
$0 contiene il nome dello script;
$USER contiene il nome dell’utente che esegue lo script;
$LINENO contiene il numero di riga corrente nello script.
Matteo Collica - Shell Scripting (#!/bin/bash) - Lezione n°4
4.
Array
● Inizializzazione
● Visualizzazione contenuto
● Visualizzazione contenuto: Intervalli
● Eliminazione
31
Matteo Collica - Shell Scripting (#!/bin/bash) - Array
array
Un array è una collezione ordinata di valori che possono essere
richiamati univocamente tramite indici numerici (a partire da 0).
Qualsiasi variabile può essere utilizzata come vettore. Non esiste un
limite massimo alla dimensione di un array, e non è necessario
indicizzare o assegnare gli elementi in modo contiguo.
32
Matteo Collica - Shell Scripting (#!/bin/bash) - Array33
Inizializzazione
Per definire un array possiamo ricorrere
a 3 diversi metodi di inizializzazione.
Matteo Collica - Shell Scripting (#!/bin/bash) - Array34
Visualizzazione contenuto
Matteo Collica - Shell Scripting (#!/bin/bash) - Array35
Visualizzazione contenuto: Intervalli
Matteo Collica - Shell Scripting (#!/bin/bash) - Array
Eliminazione
36
Matteo Collica - Shell Scripting (#!/bin/bash) - Array
Array: Riepilogo Sintassi
❏ array[@] o array[*] per fare riferimento all’intero contenuto;
❏ #array[@] o #array[*] per conoscere il numero di elementi.
❏ array[@]:x:y per accedere a y elementi di indice da x in poi;
❏ array[x]:y:z per accedere a z caratteri a partire dal numero y
dell’elemento di indice x.
❏ unset array[x] per rimuovere l’elemento di indice x;
❏ unset array per eliminare un array.
37
Matteo Collica - Shell Scripting (#!/bin/bash) - Lezione n°5
5.
Aritmetica
● Espansione aritmetica
● Variabili
● Espressioni aritmetiche
● Aritmetica non intera
38
Matteo Collica - Shell Scripting (#!/bin/bash) - Aritmetica
Aritmetica
Le operazioni aritmetiche seguono lo stile dei linguaggi derivati
dal C, ma Bash supporta soltanto l’aritmetica intera.
Numeri decimali causerebbero un errore di sintassi e i risultati
delle divisioni sono quelli dati dalla divisione intera.
39
Matteo Collica - Shell Scripting (#!/bin/bash) - Aritmetica
Espansione Aritmetica
➔ Sintassi: $(( <espressione> ))
➔ Operatori classici: +, -, *, /
➔ Operatore di modulo (resto della divisione intera): %
➔ Operatore di assegnazione: =
➔ Operatori composti: +=, -=, *=, /=, %=
➔ Operatore di esponenziazione: **
➔ Operatori di incremento e decremento: ++, --
➔ Operatore -() per invertire il segno di un espressione
40
Matteo Collica - Shell Scripting (#!/bin/bash) - Aritmetica41
Matteo Collica - Shell Scripting (#!/bin/bash) - Aritmetica
Variabili
All’interno di un’espressione aritmetica è possibile riferirsi a variabili
dichiarate precedentemente nello stesso script.
❖ Omettendo $ ci si può riferire al valore di una variabile;
❖ Specificando $ viene effettuata una sostituzione di stringa.
42
Matteo Collica - Shell Scripting (#!/bin/bash) - Aritmetica
Espressioni Aritmetiche
➔ Un’espressione aritmetica può formare anche un comando a sé
stante, usando la sintassi: (( variabile = <espressione> ))
➔ Operatore di separazione in sotto-espressioni: ,
◆ separa in diverse sotto-espressioni da valutare distintamente; il valore finale
sarà quello dell’ultima sotto-espressione valutata.
➔ Operatori di confronto intero <, >, <=, >=, ==, !=
◆ Ciascuno viene valutato come 1 se “vero” o 0 se “falso”.
➔ Operatori di logica booleana: !, &&, ||
➔ Operatore condizionale: ?
43
Matteo Collica - Shell Scripting (#!/bin/bash) - Aritmetica44
Matteo Collica - Shell Scripting (#!/bin/bash) - Aritmetica
Aritmetica Non Intera
Per includere i numeri decimali possiamo ricorrere a tool esterni,
come la utility bc (per ulteriori informazioni consultare $man bc):
45
Matteo Collica - Shell Scripting (#!/bin/bash) - Lezione n°6
6.
Test
● Confronto tra interi
● Confronto tra stringhe
● Test su file
● Nuova sintassi
46
Matteo Collica - Shell Scripting (#!/bin/bash) - Test
Test
Permette di confrontare valori e controllare i tipi di file
❏ Sintassi: test <espressione> o [ <espressione> ]
❏ Lista di opzioni disponibili con $man test
47
Matteo Collica - Shell Scripting (#!/bin/bash) - Test
Confronto tra Interi
-eq: value 1 equals value 2 == (uguale a)
-ge: value 1 greater or equal to value 2 >= (maggiore o uguale a)
-gt: value 1 greater than value 2 > (maggiore di)
-le: value 1 less than or equal to value 2 <= (minore o uguale a)
-lt: value 1 less than value 2 < (minore di)
-ne: value 1 does not equal value 2 != (diverso da)
48
Matteo Collica - Shell Scripting (#!/bin/bash) - Test49
Matteo Collica - Shell Scripting (#!/bin/bash) - Test
Confronto tra Stringhe
❖ Uguaglianza: String1 == String2
❖ Disuguaglianza: String1 != String2
50
Matteo Collica - Shell Scripting (#!/bin/bash) - Test
Test su File
❖ Se un file esiste: -e <FILE>
➢ Se un file esiste ed è una directory: -d
➢ Se un file esiste ed è un file regolare: -f
❖ <FILE1> -nt <FILE2>
➢ Se FILE1 è più recente (come data di modifica) di FILE2
❖ <FILE1> -ot <FILE2>
➢ Se FILE1 è più vecchio di FILE2
51
Matteo Collica - Shell Scripting (#!/bin/bash) - Test
Nuova Sintassi
Bash è tra le shell che implementano anche un nuovo comando test,
identificato da doppie parentesi quadre [[, che fornisce funzioni estese
come la verifica se una stringa corrisponde a un’espressione regolare.
Ulteriori informazioni nella pagina di manuale di Bash: $man bash.
52
Matteo Collica - Shell Scripting (#!/bin/bash) - Lezione n°7
7.
Costrutti condizionali
● If-then
○ fi
○ elif
○ else
● case
53
Matteo Collica - Shell Scripting (#!/bin/bash) - Costrutti condizionali
If-Then-fi
If valuta $? (il risultato di un test o lo stato di uscita di un comando)
➔ then: comandi da eseguire se la condizione ritorna “vero”
fi: comando che denota la fine del costrutto if.
54
Matteo Collica - Shell Scripting (#!/bin/bash) - Costrutti condizionali
Elif
elif: else if, condizioni aggiuntive, seguite a loro volta da then.
55
Matteo Collica - Shell Scripting (#!/bin/bash) - Costrutti condizionali
Else
Comandi che dovranno essere eseguiti nel caso in cui né la condizione
originale (if) né ciascuna di quelle contenute nelle clausole elif siano vere.
56
Matteo Collica - Shell Scripting (#!/bin/bash) - Costrutti condizionali
If-Then-Elif-Else-Fi
57
Matteo Collica - Shell Scripting (#!/bin/bash) - Costrutti condizionali
Case
Permette la definizione di più condizioni sul valore di una variabile.
58
Matteo Collica - Shell Scripting (#!/bin/bash) - Costrutti condizionali59
Terminando un blocco con ;;
termina anche il costrutto case;
Terminando un blocco con ;&
verrà eseguito anche il blocco
seguente;
Terminando un blocco con ;;&
verrà preso in considerazione
anche il blocco seguente.
Case: 3 modi di Terminare un Blocco
Matteo Collica - Shell Scripting (#!/bin/bash) - Lezione n°8
8.
Cicli iterativi
● Cicli for
○ sintassi derivata dal C
● Cicli while
● Cicli until
● Cicli senza condizione
60
Matteo Collica - Shell Scripting (#!/bin/bash) - Cicli iterativi
Cicli For
❏ Itera gli elementi di una lista
❏ Sintassi:
61
for <variabile> in <lista>
do
<istruzioni>
done
<variabile> assume ordinatamente il valore di ogni elemento della lista.
Matteo Collica - Shell Scripting (#!/bin/bash) - Cicli iterativi62
Matteo Collica - Shell Scripting (#!/bin/bash) - Cicli iterativi
Cicli For: Sintassi derivata dal C
Questo ciclo for usa tre diverse espressioni aritmetiche, separate da ;
63
Matteo Collica - Shell Scripting (#!/bin/bash) - Cicli iterativi
Cicli While
❏ Itera finché la condizione è valutata come vera
64
Matteo Collica - Shell Scripting (#!/bin/bash) - Cicli iterativi
Cicli Until
❏ Itera finché la condizione non viene valutata come vera
65
Matteo Collica - Shell Scripting (#!/bin/bash) - Cicli iterativi
Cicli Senza Condizione
Potremmo voler ripetere delle istruzioni senza una condizione specifica
da verificare ad ogni ciclo.
In Bash il simbolo : e la parola true vengono valutati sempre come vero,
perciò se utilizzati come condizione di un ciclo while questa risulterà
sempre verificata, ed eseguirà le istruzioni che contiene all’infinito.
66
Matteo Collica - Shell Scripting (#!/bin/bash) - Cicli iterativi67
Produrrebbe lo stesso risultato
Matteo Collica - Shell Scripting (#!/bin/bash) - Lezione n°9
9.
Funzioni
● Definire una funzione
● Richiamare una funzione
● Passaggio di parametri
● Valore di ritorno
● Variabili globali
● Variabili locali
68
Matteo Collica - Shell Scripting (#!/bin/bash) - Funzioni
Funzioni
69
Possiamo immaginare le funzioni in Bash Scripting come degli
script dentro lo script, un insieme di istruzioni che vengono scritte
una sola volta per poi essere richiamate più volte.
Matteo Collica - Shell Scripting (#!/bin/bash) - Funzioni
Definire una funzione
70
1. 2.
● I due metodi sono validi ed equivalenti, quale utilizzare è solo una questione di preferenza personale;
● In Bash le parentesi () sono solo “per decorazione”, non si metterà mai qualcosa dentro di queste;
● La definizione della funzione (la funzione effettiva stessa) deve apparire nello script prima di qualsiasi chiamata.
Matteo Collica - Shell Scripting (#!/bin/bash) - Funzioni
Richiamare una funzione
71
Matteo Collica - Shell Scripting (#!/bin/bash) - Funzioni
Passaggio di parametri
Accade spesso di voler passare alla funzione dei dati da elaborare:
72
Matteo Collica - Shell Scripting (#!/bin/bash) - Funzioni
Passaggio di parametri
Naturalmente si potrebbero anche passare come parametri gli elementi di un array:
73
Matteo Collica - Shell Scripting (#!/bin/bash) - Funzioni
Valore di ritorno
74
Matteo Collica - Shell Scripting (#!/bin/bash) - Funzioni
Scope
Lo scope (ambito) si riferisce a quali
parti di uno script possono
accedere al valore delle variabili.
Variabili
Globali
Scope delle variabili
In Bash, per impostazione
predefinita, le variabili sono definite
come globali (anche se dichiarate
all’interno di una funzione), eccetto
che per i parametri posizionali ($*).
75
Matteo Collica - Shell Scripting (#!/bin/bash) - Funzioni76
Matteo Collica - Shell Scripting (#!/bin/bash) - Funzioni
Subshell
In Bash, uno o più comandi racchiusi
da parentesi vengono eseguiti in
una subshell; questa riceve una
copia dell’ambiente di esecuzione,
che include – fra le altre cose – tutte
le variabili dichiarate.
Variabili Locali
Local
La sintassi local <nome>=<valore>
restringe lo scope di una variabile a
ogni diversa chiamata della
funzione in cui viene dichiarata,
rendendola di fatto locale.
77
Matteo Collica - Shell Scripting (#!/bin/bash) - Funzioni78
Matteo Collica - Shell Scripting (#!/bin/bash) - Lezione n°10
10.
Quoting
● Politiche di quoting
● Weak quoting
● Carattere di escape
79
Matteo Collica - Shell Scripting (#!/bin/bash) - Quoting
Weak quoting

Viene anteposto ai caratteri
speciali da non interpretare
come tali.
` (Alt Gr + ‘)
Viene utilizzato per
racchiudere veri e propri
comandi (come per le subshell)
di cui visualizzare l’output
$
Carattere che precede il nome
di una variabile per
visualizzarne il contenuto.
80
“”
“
Matteo Collica - Shell Scripting (#!/bin/bash) - Quoting81
Weak (“ ”)
Ad eccezione di tre caratteri
speciali, qualunque altro
carattere racchiuso fra
virgolette doppie non viene
interpretato diversamente.
Politiche di quoting
Strong (‘ ’)
Racchiudendo una sequenza di
caratteri fra apici singoli non
viene interpretato alcun
carattere speciale.
Matteo Collica - Shell Scripting (#!/bin/bash) - Quoting
Carattere di escape
82
Un modo alternativo al quoting per far mantenere a Bash i singoli spazi
si ottiene utilizzando il carattere di escape ().
Matteo Collica - Shell Scripting (#!/bin/bash) - Lezione n°11
11.
Terminare uno script
● Exit status
● exit
83
Matteo Collica - Shell Scripting (#!/bin/bash) - Terminare uno script
Exit Status
Al termine dell’esecuzione di un comando viene ritornato un
valore intero, chiamato exit status, al processo chiamante.
84
Matteo Collica - Shell Scripting (#!/bin/bash) - Terminare uno script
Exit Status
Per convenzione, si usa ritornare uno stato di uscita 0 se
l’esecuzione è terminata con successo (che nel caso di un
comando if corrisponde al valore vero), oppure un valore
intero positivo nel caso essa sia fallita con un errore.
85
Matteo Collica - Shell Scripting (#!/bin/bash) - Terminare uno script
Exit
Uno script Bash ritorna un valore al processo chiamante
tramite il comando exit <exit status>; che terminerà lo
script e ritornerà uno stato di uscita del valore specificato,
ad indicare o meno un certo tipo di errore.
86
Matteo Collica - Shell Scripting (#!/bin/bash) - Terminare uno script87
Matteo Collica - Shell Scripting (#!/bin/bash) - Lezione n°12
12.
Debugging
● Modalità di debugging
○ Verbose
○ Xtrace
● Debugging step-by-step
○ set
○ echo
88
Matteo Collica - Shell Scripting (#!/bin/bash) - Debugging
Debugging
Gli strumenti che abbiamo introdotto finora ci permettono di creare
script anche molto complessi, e perciò saremo sempre più esposti a
commettere errori di ogni genere. Il debugging è quindi un’attività molto
importante per ogni programmatore, e inizia dal saper leggere con
attenzione i messaggi di errore (se ne abbiamo ottenuto uno).
89
Matteo Collica - Shell Scripting (#!/bin/bash) - Debugging
Modalità di Debugging
Verbose ($bash -v <nome script>)
Ogni comando viene stampato (nel canale
stderr) così come deve essere eseguito,
prima di effettuare ogni singola
espansione.
90
Xtrace ($bash -x <nome script>)
Bash stampa (sempre nel canale stderr)
ogni comando come è stato eseguito dopo
ogni espansione, indicando inoltre il livello
di ogni subshell in cui è stato eseguito (con
il prefisso + per ciascuna di esse).
Matteo Collica - Shell Scripting (#!/bin/bash) - Debugging91
Matteo Collica - Shell Scripting (#!/bin/bash) - Debugging92
Matteo Collica - Shell Scripting (#!/bin/bash) - Debugging
Debugging step-by-step
Nella creazione di uno script si aggiungono passo passo nuovi
comandi, per cui può essere utile verificarne progressivamente il
funzionamento, per farlo possiamo aiutarci con il comando set.
93
Matteo Collica - Shell Scripting (#!/bin/bash) - Debugging
Debugging step-by-step: Set
Il builtin set prevede due opzioni per attivare sia la modalità verbose
che quella xtrace solo per alcune porzioni di codice.
Sintassi
Una volta specificato set -x o set -v ogni comando successivo verrà
eseguito nella modalità specificata finché non si giunge al termine dello
script o ad un comando set +x o set +v.
94
Matteo Collica - Shell Scripting (#!/bin/bash) - Debugging95
Matteo Collica - Shell Scripting (#!/bin/bash) - Debugging
Debugging step-by-step: Echo
L’uso del comando echo per controllare il contenuto di variabili,
posizionato strategicamente all’interno di uno script, è spesso una
soluzione più che valida per individuare eventuali malfunzionamenti.
96
Grazie!
Qualche domanda?
97
collicamatteo@outlook.it
Matteo Collica - Shell Scripting (#!/bin/bash) - Fine
Crediti
Un ringraziamento speciale alla disegnatrice che ha
realizzato e rilasciato il template gratuitamente:
★ Template della presentazione scaricato da
SlidesCarnival; disegnato da Jimena Catalina
E ai creatori della guida da cui ho preso maggiormente
ispirazione per la realizzazione di questa presentazione:
★ Shell Scripting e Bash: la Guida
98 Matteo Collica - Shell Scripting (#!/bin/bash) - Crediti

More Related Content

What's hot

What's hot (7)

3.rm the literature review
3.rm the literature review3.rm the literature review
3.rm the literature review
 
Types of literature review
Types of literature reviewTypes of literature review
Types of literature review
 
Review of literature
Review of literature Review of literature
Review of literature
 
1 Nature of Inquiry and Research.pptx
1 Nature of Inquiry and Research.pptx1 Nature of Inquiry and Research.pptx
1 Nature of Inquiry and Research.pptx
 
Literature review
Literature reviewLiterature review
Literature review
 
IMRAD FORMAT
IMRAD FORMAT IMRAD FORMAT
IMRAD FORMAT
 
literature review
literature reviewliterature review
literature review
 

Similar to [BASH] Shell Scripting [ITA]

Linux day 2016 la shell in linux
Linux day 2016   la shell in linuxLinux day 2016   la shell in linux
Linux day 2016 la shell in linuxGiuseppe Piccolo
 
Linux@Unina
Linux@UninaLinux@Unina
Linux@UninaNaLUG
 
DotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScriptDotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScriptSinergia Totale
 
Capitolo 7 elementi di programmazione c-c++
Capitolo 7   elementi di programmazione  c-c++Capitolo 7   elementi di programmazione  c-c++
Capitolo 7 elementi di programmazione c-c++Giovanni Della Lunga
 
[drupalday2017] - DevOps: strumenti di automazione per Drupal8
[drupalday2017] - DevOps: strumenti di automazione per Drupal8[drupalday2017] - DevOps: strumenti di automazione per Drupal8
[drupalday2017] - DevOps: strumenti di automazione per Drupal8DrupalDay
 
[Luca Cracco] - DevOps: strumenti di automazione per Drupal8
[Luca Cracco] - DevOps: strumenti di automazione per Drupal8[Luca Cracco] - DevOps: strumenti di automazione per Drupal8
[Luca Cracco] - DevOps: strumenti di automazione per Drupal8Wellnet srl
 
Seminario team working - 21-1-2015
Seminario team working - 21-1-2015Seminario team working - 21-1-2015
Seminario team working - 21-1-2015Alessandro Loffredo
 
Continuous Integration e High Quality Code
Continuous Integration e High Quality CodeContinuous Integration e High Quality Code
Continuous Integration e High Quality CodeDaniele Mondello
 
Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoti...
 Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoti... Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoti...
Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoti...Fulvio Corno
 
Apache Maven - Gestione di progetti Java e build automation
Apache Maven - Gestione di progetti Java e build automationApache Maven - Gestione di progetti Java e build automation
Apache Maven - Gestione di progetti Java e build automationTiziano Serritella
 

Similar to [BASH] Shell Scripting [ITA] (20)

Bash programming
Bash programmingBash programming
Bash programming
 
Battaglia Navale
Battaglia NavaleBattaglia Navale
Battaglia Navale
 
Corso Bash
Corso BashCorso Bash
Corso Bash
 
Linux day 2016 la shell in linux
Linux day 2016   la shell in linuxLinux day 2016   la shell in linux
Linux day 2016 la shell in linux
 
GNU Linux Programming introduction
GNU Linux Programming introductionGNU Linux Programming introduction
GNU Linux Programming introduction
 
Linux@Unina
Linux@UninaLinux@Unina
Linux@Unina
 
DotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScriptDotNetToscana - Sessione TypeScript
DotNetToscana - Sessione TypeScript
 
Capitolo 7 elementi di programmazione c-c++
Capitolo 7   elementi di programmazione  c-c++Capitolo 7   elementi di programmazione  c-c++
Capitolo 7 elementi di programmazione c-c++
 
[drupalday2017] - DevOps: strumenti di automazione per Drupal8
[drupalday2017] - DevOps: strumenti di automazione per Drupal8[drupalday2017] - DevOps: strumenti di automazione per Drupal8
[drupalday2017] - DevOps: strumenti di automazione per Drupal8
 
[Luca Cracco] - DevOps: strumenti di automazione per Drupal8
[Luca Cracco] - DevOps: strumenti di automazione per Drupal8[Luca Cracco] - DevOps: strumenti di automazione per Drupal8
[Luca Cracco] - DevOps: strumenti di automazione per Drupal8
 
Bash Scripting
Bash ScriptingBash Scripting
Bash Scripting
 
Seminario team working - 21-1-2015
Seminario team working - 21-1-2015Seminario team working - 21-1-2015
Seminario team working - 21-1-2015
 
#!/bin/bash ed esempi di scripting
#!/bin/bash ed esempi di scripting#!/bin/bash ed esempi di scripting
#!/bin/bash ed esempi di scripting
 
Bash intro
Bash introBash intro
Bash intro
 
Introduzione ros
Introduzione rosIntroduzione ros
Introduzione ros
 
Continuous Integration e High Quality Code
Continuous Integration e High Quality CodeContinuous Integration e High Quality Code
Continuous Integration e High Quality Code
 
Linguaggi di programmazione
Linguaggi di programmazioneLinguaggi di programmazione
Linguaggi di programmazione
 
Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoti...
 Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoti... Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoti...
Scripting - Esecuzione condizionale - Costrutti iterativi - Variabili (quoti...
 
Apache Maven - Gestione di progetti Java e build automation
Apache Maven - Gestione di progetti Java e build automationApache Maven - Gestione di progetti Java e build automation
Apache Maven - Gestione di progetti Java e build automation
 
Shell unix
Shell unixShell unix
Shell unix
 

[BASH] Shell Scripting [ITA]

  • 1. SHELL SCRIPTING Matteo Collica v29/06/2020 https://www.linkedin.com/in/MatteoCollica/
  • 2. 0. Indice dei contenuti 2 1 - Introduzione 2 - Primi passi 3 - Variabili 4 - Array 5 - Aritmetica 6 - Test 7 - Costrutti condizionali 8 - Cicli iterativi 9 - Funzioni 10 - Quoting 11 - Terminare uno script 12 - Debugging Matteo Collica - Shell Scripting (#!/bin/bash) - Indice
  • 3. Matteo Collica - Shell Scripting (#!/bin/bash) - Lezione n°1 1. Introduzione ● Shell ● Comandi della shell ● Bash script ● Shell scripting ● Perché programmare la shell? 3
  • 4. Matteo Collica - Shell Scripting (#!/bin/bash) - Introduzione shell Interprete di comandi che permette all’utente di comunicare col sistema operativo attraverso una serie di funzioni predefinite, o di eseguire programmi e script. 4
  • 5. Matteo Collica - Shell Scripting (#!/bin/bash) - Introduzione5
  • 6. Matteo Collica - Shell Scripting (#!/bin/bash) - Introduzione In questa presentazione esploreremo le basi dello scripting di shell, e per farlo ci baseremo sulla shell Linux più diffusa, cioè Bash. 6
  • 7. Matteo Collica - Shell Scripting (#!/bin/bash) - Introduzione7 Comandi della shell Nella shell di Linux (Bash) possiamo eseguire tre distinti elementi: ❏ Oggetti eseguibili: comandi di shell (come ad esempio ls) per cui esiste un relativo file eseguibile nelle directory predefinite di sistema; ❏ Comandi built-in: comandi incorporati nella shell (come cd, echo); ❏ Script: programmi scritti in linguaggio bash script che possono contenere sia comandi built-in che oggetti eseguibili.
  • 8. Matteo Collica - Shell Scripting (#!/bin/bash) - Introduzione8 Bash script Bash offre una sintassi ricca, tale da permettere la creazione e l’esecuzione di sequenze di comandi della shell, tecnicamente chiamate Bash script. Bash Script Script File testuale che può contenere un elenco di comandi, così come variabili, funzioni, strutture di controllo di flusso e tutti gli altri costrutti tipici della programmazione.
  • 9. Matteo Collica - Shell Scripting (#!/bin/bash) - Introduzione Shell Scripting In definitiva, un Bash script è uno script scritto nel linguaggio di scripting nativo messo a disposizione dalla shell Bash. L’arte di creare e modificare gli script della shell prende il nome di Shell Scripting. 9
  • 10. Matteo Collica - Shell Scripting (#!/bin/bash) - Introduzione Usi comuni I bash script vengono comunemente usati per automatizzare molte attività di amministrazione di sistema, come l’analisi dei log e il backup dei dischi. Sono anche molto usati come script di installazione per programmi complessi. Perché Programmare la Shell? L’Importanza di saperlo fare Gli script permettono di risolvere problemi complessi con istruzioni semplici. Ad esempio, solo una riga per richiamare un programma esterno; al tempo stesso, la shell ci mette a disposizione pressoché tutta la potenza di un linguaggio di programmazione completo. 10
  • 11. Matteo Collica - Shell Scripting (#!/bin/bash) - Lezione n°2 2. Primi passi ● Sintassi del linguaggio ● Eseguire uno script 11
  • 12. Matteo Collica - Shell Scripting (#!/bin/bash) - Primi passi12 La prima riga dello script indica al sistema che il file deve essere eseguito da /bin/bash, che corrisponde al percorso standard dell’interprete BASH su qualsiasi sistema basato su Unix. Sintassi del Linguaggio
  • 13. Matteo Collica - Shell Scripting (#!/bin/bash) - Primi passi Eseguire uno Script chmod +rx ./script.sh 13
  • 14. Matteo Collica - Shell Scripting (#!/bin/bash) - Primi passi Eseguire un Bash Script ❖ $sh <nome script> ignora le estensioni specifiche di Bash e, di conseguenza, potrebbe compromettere l’esecuzione. ➢ Una possibile alternativa è $bash. ❖ È necessario il permesso di lettura perché la shell per poter eseguire uno script deve essere prima in grado di leggere il file che lo contiene. ❖ È necessario specificare il percorso completo (se non fa parte di quelli listati nella variabile $PATH) di uno script per eseguirlo. ➢ Esempio - per la directory corrente: ./<nomescript>. 14
  • 15. Matteo Collica - Shell Scripting (#!/bin/bash) - Primi passi15
  • 16. 3. Variabili● Sintassi ● Tipizzazione ● Input ● Valore predefinito ● Variabili predefinite ● Parametri posizionali 16 Matteo Collica - Shell Scripting (#!/bin/bash) - Lezione n°3
  • 17. Matteo Collica - Shell Scripting (#!/bin/bash) - Variabili Variabili Esistono due diversi tipi di variabili: ● Variabili locali: vengono dichiarate dal programmatore ed utilizzate all’interno dello script, le chiameremo per semplicità solo “variabili”; ● Variabili predefinite: sono definite dal sistema ed utilizzabili per ottenere informazioni, un esempio è $PATH che contiene i percorsi delle directory in cui il sistema cerca i file eseguibili, ne vedremo alcune particolarmente utili per gli script qualche slide più avanti. 17
  • 18. 18 Per dichiarare una variabile è sufficiente assegnarle un valore Per assegnare un valore ad una variabile: <nome>=<valore> Per leggere il valore di una variabile: $<nome> Sintassi Matteo Collica - Shell Scripting (#!/bin/bash) - Variabili
  • 19. 19 Matteo Collica - Shell Scripting (#!/bin/bash) - Variabili
  • 20. Matteo Collica - Shell Scripting (#!/bin/bash) - Variabili Bash – come Perl o PHP – è un linguaggio a tipizzazione dinamica: le variabili non possiedono un tipo vero e proprio, ma vengono “convertite” in base al contesto. Tipizzazione Qualunque valore viene di fatto memorizzato come stringa, ma funzioni che richiedono numeri in input possono comunque trattarle come tali. 20
  • 21. 21 Matteo Collica - Shell Scripting (#!/bin/bash) - Variabili
  • 22. 22 Il builtin read legge una riga dallo standard input e la memorizza nella variabile fornita come parametro Input Matteo Collica - Shell Scripting (#!/bin/bash) - Variabili
  • 23. Matteo Collica - Shell Scripting (#!/bin/bash) - Variabili23 Valore Predefinito? In Bash non è obbligatorio dichiarare le variabili. Se però si cerca di leggere il contenuto di una variabile non dichiarata, si otterrà semplicemente una stringa vuota, senza che venga generato alcun messaggio di errore.
  • 24. Matteo Collica - Shell Scripting (#!/bin/bash) - Variabili Valore Predefinito È possibile specificare un valore da utilizzare nel caso in cui la variabile non sia stata dichiarata per mezzo dell’operatore “:-” 24
  • 25. Matteo Collica - Shell Scripting (#!/bin/bash) - Variabili25
  • 26. Matteo Collica - Shell Scripting (#!/bin/bash) - Variabili Valore Predefinito Esiste anche l’operatore ":=", che imposta un valore alla variabile se questa non è definita 26
  • 27. Matteo Collica - Shell Scripting (#!/bin/bash) - Variabili Argomenti Gli stessi script Bash sono programmi che possono essere eseguiti; anch’essi perciò possono accettare degli argomenti. Variabili Predefinite Parametri posizionali Gli argomenti sono disponibili in un programma come parametri posizionali, simili alle variabili ma identificati da numeri ($1, $2... etc). 27
  • 28. Matteo Collica - Shell Scripting (#!/bin/bash) - Variabili28 I parametri posizionali successivi al nono ($9) invece richiedono l’espansione con l’uso delle parentesi graffe; per riferirsi al decimo parametro, ad esempio, si dovrà indicare ${10}, altrimenti $10 verrebbe interpretato come ${1}0. Parametri Posizionali
  • 29. Matteo Collica - Shell Scripting (#!/bin/bash) - Variabili29 Il numero di parametri posizionali è memorizzato in $#, ed è possibile stampare una stringa contenente tutti i parametri utilizzando la variabile predefinita $* Parametri Posizionali
  • 30. Matteo Collica - Shell Scripting (#!/bin/bash) - Variabili30 Altre Variabili Predefinite $$ Memorizza il PID (Process IDentifier) della shell in esecuzione. Spesso inclusa nei nomi dei file temporanei generati da uno script, come /tmp/script.$$, se più istanze dello script possono essere eseguite allo stesso tempo. $! Corrisponde al PID dell’ultimo processo eseguito in background. Utile per tenerne traccia mentre questo continua a svolgere il proprio lavoro. IFS Internal Field Separator, rappresenta il carattere (o i caratteri) che separa i diversi parametri fra di loro. Il valore predefinito è ‘SPACE TAB NEWLINE’. Alcune variabili utili per gli script $? contiene lo stato di uscita dell’ultimo comando eseguito, consiste in un valore intero positivo compreso tra 0 e 255; $0 contiene il nome dello script; $USER contiene il nome dell’utente che esegue lo script; $LINENO contiene il numero di riga corrente nello script.
  • 31. Matteo Collica - Shell Scripting (#!/bin/bash) - Lezione n°4 4. Array ● Inizializzazione ● Visualizzazione contenuto ● Visualizzazione contenuto: Intervalli ● Eliminazione 31
  • 32. Matteo Collica - Shell Scripting (#!/bin/bash) - Array array Un array è una collezione ordinata di valori che possono essere richiamati univocamente tramite indici numerici (a partire da 0). Qualsiasi variabile può essere utilizzata come vettore. Non esiste un limite massimo alla dimensione di un array, e non è necessario indicizzare o assegnare gli elementi in modo contiguo. 32
  • 33. Matteo Collica - Shell Scripting (#!/bin/bash) - Array33 Inizializzazione Per definire un array possiamo ricorrere a 3 diversi metodi di inizializzazione.
  • 34. Matteo Collica - Shell Scripting (#!/bin/bash) - Array34 Visualizzazione contenuto
  • 35. Matteo Collica - Shell Scripting (#!/bin/bash) - Array35 Visualizzazione contenuto: Intervalli
  • 36. Matteo Collica - Shell Scripting (#!/bin/bash) - Array Eliminazione 36
  • 37. Matteo Collica - Shell Scripting (#!/bin/bash) - Array Array: Riepilogo Sintassi ❏ array[@] o array[*] per fare riferimento all’intero contenuto; ❏ #array[@] o #array[*] per conoscere il numero di elementi. ❏ array[@]:x:y per accedere a y elementi di indice da x in poi; ❏ array[x]:y:z per accedere a z caratteri a partire dal numero y dell’elemento di indice x. ❏ unset array[x] per rimuovere l’elemento di indice x; ❏ unset array per eliminare un array. 37
  • 38. Matteo Collica - Shell Scripting (#!/bin/bash) - Lezione n°5 5. Aritmetica ● Espansione aritmetica ● Variabili ● Espressioni aritmetiche ● Aritmetica non intera 38
  • 39. Matteo Collica - Shell Scripting (#!/bin/bash) - Aritmetica Aritmetica Le operazioni aritmetiche seguono lo stile dei linguaggi derivati dal C, ma Bash supporta soltanto l’aritmetica intera. Numeri decimali causerebbero un errore di sintassi e i risultati delle divisioni sono quelli dati dalla divisione intera. 39
  • 40. Matteo Collica - Shell Scripting (#!/bin/bash) - Aritmetica Espansione Aritmetica ➔ Sintassi: $(( <espressione> )) ➔ Operatori classici: +, -, *, / ➔ Operatore di modulo (resto della divisione intera): % ➔ Operatore di assegnazione: = ➔ Operatori composti: +=, -=, *=, /=, %= ➔ Operatore di esponenziazione: ** ➔ Operatori di incremento e decremento: ++, -- ➔ Operatore -() per invertire il segno di un espressione 40
  • 41. Matteo Collica - Shell Scripting (#!/bin/bash) - Aritmetica41
  • 42. Matteo Collica - Shell Scripting (#!/bin/bash) - Aritmetica Variabili All’interno di un’espressione aritmetica è possibile riferirsi a variabili dichiarate precedentemente nello stesso script. ❖ Omettendo $ ci si può riferire al valore di una variabile; ❖ Specificando $ viene effettuata una sostituzione di stringa. 42
  • 43. Matteo Collica - Shell Scripting (#!/bin/bash) - Aritmetica Espressioni Aritmetiche ➔ Un’espressione aritmetica può formare anche un comando a sé stante, usando la sintassi: (( variabile = <espressione> )) ➔ Operatore di separazione in sotto-espressioni: , ◆ separa in diverse sotto-espressioni da valutare distintamente; il valore finale sarà quello dell’ultima sotto-espressione valutata. ➔ Operatori di confronto intero <, >, <=, >=, ==, != ◆ Ciascuno viene valutato come 1 se “vero” o 0 se “falso”. ➔ Operatori di logica booleana: !, &&, || ➔ Operatore condizionale: ? 43
  • 44. Matteo Collica - Shell Scripting (#!/bin/bash) - Aritmetica44
  • 45. Matteo Collica - Shell Scripting (#!/bin/bash) - Aritmetica Aritmetica Non Intera Per includere i numeri decimali possiamo ricorrere a tool esterni, come la utility bc (per ulteriori informazioni consultare $man bc): 45
  • 46. Matteo Collica - Shell Scripting (#!/bin/bash) - Lezione n°6 6. Test ● Confronto tra interi ● Confronto tra stringhe ● Test su file ● Nuova sintassi 46
  • 47. Matteo Collica - Shell Scripting (#!/bin/bash) - Test Test Permette di confrontare valori e controllare i tipi di file ❏ Sintassi: test <espressione> o [ <espressione> ] ❏ Lista di opzioni disponibili con $man test 47
  • 48. Matteo Collica - Shell Scripting (#!/bin/bash) - Test Confronto tra Interi -eq: value 1 equals value 2 == (uguale a) -ge: value 1 greater or equal to value 2 >= (maggiore o uguale a) -gt: value 1 greater than value 2 > (maggiore di) -le: value 1 less than or equal to value 2 <= (minore o uguale a) -lt: value 1 less than value 2 < (minore di) -ne: value 1 does not equal value 2 != (diverso da) 48
  • 49. Matteo Collica - Shell Scripting (#!/bin/bash) - Test49
  • 50. Matteo Collica - Shell Scripting (#!/bin/bash) - Test Confronto tra Stringhe ❖ Uguaglianza: String1 == String2 ❖ Disuguaglianza: String1 != String2 50
  • 51. Matteo Collica - Shell Scripting (#!/bin/bash) - Test Test su File ❖ Se un file esiste: -e <FILE> ➢ Se un file esiste ed è una directory: -d ➢ Se un file esiste ed è un file regolare: -f ❖ <FILE1> -nt <FILE2> ➢ Se FILE1 è più recente (come data di modifica) di FILE2 ❖ <FILE1> -ot <FILE2> ➢ Se FILE1 è più vecchio di FILE2 51
  • 52. Matteo Collica - Shell Scripting (#!/bin/bash) - Test Nuova Sintassi Bash è tra le shell che implementano anche un nuovo comando test, identificato da doppie parentesi quadre [[, che fornisce funzioni estese come la verifica se una stringa corrisponde a un’espressione regolare. Ulteriori informazioni nella pagina di manuale di Bash: $man bash. 52
  • 53. Matteo Collica - Shell Scripting (#!/bin/bash) - Lezione n°7 7. Costrutti condizionali ● If-then ○ fi ○ elif ○ else ● case 53
  • 54. Matteo Collica - Shell Scripting (#!/bin/bash) - Costrutti condizionali If-Then-fi If valuta $? (il risultato di un test o lo stato di uscita di un comando) ➔ then: comandi da eseguire se la condizione ritorna “vero” fi: comando che denota la fine del costrutto if. 54
  • 55. Matteo Collica - Shell Scripting (#!/bin/bash) - Costrutti condizionali Elif elif: else if, condizioni aggiuntive, seguite a loro volta da then. 55
  • 56. Matteo Collica - Shell Scripting (#!/bin/bash) - Costrutti condizionali Else Comandi che dovranno essere eseguiti nel caso in cui né la condizione originale (if) né ciascuna di quelle contenute nelle clausole elif siano vere. 56
  • 57. Matteo Collica - Shell Scripting (#!/bin/bash) - Costrutti condizionali If-Then-Elif-Else-Fi 57
  • 58. Matteo Collica - Shell Scripting (#!/bin/bash) - Costrutti condizionali Case Permette la definizione di più condizioni sul valore di una variabile. 58
  • 59. Matteo Collica - Shell Scripting (#!/bin/bash) - Costrutti condizionali59 Terminando un blocco con ;; termina anche il costrutto case; Terminando un blocco con ;& verrà eseguito anche il blocco seguente; Terminando un blocco con ;;& verrà preso in considerazione anche il blocco seguente. Case: 3 modi di Terminare un Blocco
  • 60. Matteo Collica - Shell Scripting (#!/bin/bash) - Lezione n°8 8. Cicli iterativi ● Cicli for ○ sintassi derivata dal C ● Cicli while ● Cicli until ● Cicli senza condizione 60
  • 61. Matteo Collica - Shell Scripting (#!/bin/bash) - Cicli iterativi Cicli For ❏ Itera gli elementi di una lista ❏ Sintassi: 61 for <variabile> in <lista> do <istruzioni> done <variabile> assume ordinatamente il valore di ogni elemento della lista.
  • 62. Matteo Collica - Shell Scripting (#!/bin/bash) - Cicli iterativi62
  • 63. Matteo Collica - Shell Scripting (#!/bin/bash) - Cicli iterativi Cicli For: Sintassi derivata dal C Questo ciclo for usa tre diverse espressioni aritmetiche, separate da ; 63
  • 64. Matteo Collica - Shell Scripting (#!/bin/bash) - Cicli iterativi Cicli While ❏ Itera finché la condizione è valutata come vera 64
  • 65. Matteo Collica - Shell Scripting (#!/bin/bash) - Cicli iterativi Cicli Until ❏ Itera finché la condizione non viene valutata come vera 65
  • 66. Matteo Collica - Shell Scripting (#!/bin/bash) - Cicli iterativi Cicli Senza Condizione Potremmo voler ripetere delle istruzioni senza una condizione specifica da verificare ad ogni ciclo. In Bash il simbolo : e la parola true vengono valutati sempre come vero, perciò se utilizzati come condizione di un ciclo while questa risulterà sempre verificata, ed eseguirà le istruzioni che contiene all’infinito. 66
  • 67. Matteo Collica - Shell Scripting (#!/bin/bash) - Cicli iterativi67 Produrrebbe lo stesso risultato
  • 68. Matteo Collica - Shell Scripting (#!/bin/bash) - Lezione n°9 9. Funzioni ● Definire una funzione ● Richiamare una funzione ● Passaggio di parametri ● Valore di ritorno ● Variabili globali ● Variabili locali 68
  • 69. Matteo Collica - Shell Scripting (#!/bin/bash) - Funzioni Funzioni 69 Possiamo immaginare le funzioni in Bash Scripting come degli script dentro lo script, un insieme di istruzioni che vengono scritte una sola volta per poi essere richiamate più volte.
  • 70. Matteo Collica - Shell Scripting (#!/bin/bash) - Funzioni Definire una funzione 70 1. 2. ● I due metodi sono validi ed equivalenti, quale utilizzare è solo una questione di preferenza personale; ● In Bash le parentesi () sono solo “per decorazione”, non si metterà mai qualcosa dentro di queste; ● La definizione della funzione (la funzione effettiva stessa) deve apparire nello script prima di qualsiasi chiamata.
  • 71. Matteo Collica - Shell Scripting (#!/bin/bash) - Funzioni Richiamare una funzione 71
  • 72. Matteo Collica - Shell Scripting (#!/bin/bash) - Funzioni Passaggio di parametri Accade spesso di voler passare alla funzione dei dati da elaborare: 72
  • 73. Matteo Collica - Shell Scripting (#!/bin/bash) - Funzioni Passaggio di parametri Naturalmente si potrebbero anche passare come parametri gli elementi di un array: 73
  • 74. Matteo Collica - Shell Scripting (#!/bin/bash) - Funzioni Valore di ritorno 74
  • 75. Matteo Collica - Shell Scripting (#!/bin/bash) - Funzioni Scope Lo scope (ambito) si riferisce a quali parti di uno script possono accedere al valore delle variabili. Variabili Globali Scope delle variabili In Bash, per impostazione predefinita, le variabili sono definite come globali (anche se dichiarate all’interno di una funzione), eccetto che per i parametri posizionali ($*). 75
  • 76. Matteo Collica - Shell Scripting (#!/bin/bash) - Funzioni76
  • 77. Matteo Collica - Shell Scripting (#!/bin/bash) - Funzioni Subshell In Bash, uno o più comandi racchiusi da parentesi vengono eseguiti in una subshell; questa riceve una copia dell’ambiente di esecuzione, che include – fra le altre cose – tutte le variabili dichiarate. Variabili Locali Local La sintassi local <nome>=<valore> restringe lo scope di una variabile a ogni diversa chiamata della funzione in cui viene dichiarata, rendendola di fatto locale. 77
  • 78. Matteo Collica - Shell Scripting (#!/bin/bash) - Funzioni78
  • 79. Matteo Collica - Shell Scripting (#!/bin/bash) - Lezione n°10 10. Quoting ● Politiche di quoting ● Weak quoting ● Carattere di escape 79
  • 80. Matteo Collica - Shell Scripting (#!/bin/bash) - Quoting Weak quoting Viene anteposto ai caratteri speciali da non interpretare come tali. ` (Alt Gr + ‘) Viene utilizzato per racchiudere veri e propri comandi (come per le subshell) di cui visualizzare l’output $ Carattere che precede il nome di una variabile per visualizzarne il contenuto. 80 “”
  • 81. “ Matteo Collica - Shell Scripting (#!/bin/bash) - Quoting81 Weak (“ ”) Ad eccezione di tre caratteri speciali, qualunque altro carattere racchiuso fra virgolette doppie non viene interpretato diversamente. Politiche di quoting Strong (‘ ’) Racchiudendo una sequenza di caratteri fra apici singoli non viene interpretato alcun carattere speciale.
  • 82. Matteo Collica - Shell Scripting (#!/bin/bash) - Quoting Carattere di escape 82 Un modo alternativo al quoting per far mantenere a Bash i singoli spazi si ottiene utilizzando il carattere di escape ().
  • 83. Matteo Collica - Shell Scripting (#!/bin/bash) - Lezione n°11 11. Terminare uno script ● Exit status ● exit 83
  • 84. Matteo Collica - Shell Scripting (#!/bin/bash) - Terminare uno script Exit Status Al termine dell’esecuzione di un comando viene ritornato un valore intero, chiamato exit status, al processo chiamante. 84
  • 85. Matteo Collica - Shell Scripting (#!/bin/bash) - Terminare uno script Exit Status Per convenzione, si usa ritornare uno stato di uscita 0 se l’esecuzione è terminata con successo (che nel caso di un comando if corrisponde al valore vero), oppure un valore intero positivo nel caso essa sia fallita con un errore. 85
  • 86. Matteo Collica - Shell Scripting (#!/bin/bash) - Terminare uno script Exit Uno script Bash ritorna un valore al processo chiamante tramite il comando exit <exit status>; che terminerà lo script e ritornerà uno stato di uscita del valore specificato, ad indicare o meno un certo tipo di errore. 86
  • 87. Matteo Collica - Shell Scripting (#!/bin/bash) - Terminare uno script87
  • 88. Matteo Collica - Shell Scripting (#!/bin/bash) - Lezione n°12 12. Debugging ● Modalità di debugging ○ Verbose ○ Xtrace ● Debugging step-by-step ○ set ○ echo 88
  • 89. Matteo Collica - Shell Scripting (#!/bin/bash) - Debugging Debugging Gli strumenti che abbiamo introdotto finora ci permettono di creare script anche molto complessi, e perciò saremo sempre più esposti a commettere errori di ogni genere. Il debugging è quindi un’attività molto importante per ogni programmatore, e inizia dal saper leggere con attenzione i messaggi di errore (se ne abbiamo ottenuto uno). 89
  • 90. Matteo Collica - Shell Scripting (#!/bin/bash) - Debugging Modalità di Debugging Verbose ($bash -v <nome script>) Ogni comando viene stampato (nel canale stderr) così come deve essere eseguito, prima di effettuare ogni singola espansione. 90 Xtrace ($bash -x <nome script>) Bash stampa (sempre nel canale stderr) ogni comando come è stato eseguito dopo ogni espansione, indicando inoltre il livello di ogni subshell in cui è stato eseguito (con il prefisso + per ciascuna di esse).
  • 91. Matteo Collica - Shell Scripting (#!/bin/bash) - Debugging91
  • 92. Matteo Collica - Shell Scripting (#!/bin/bash) - Debugging92
  • 93. Matteo Collica - Shell Scripting (#!/bin/bash) - Debugging Debugging step-by-step Nella creazione di uno script si aggiungono passo passo nuovi comandi, per cui può essere utile verificarne progressivamente il funzionamento, per farlo possiamo aiutarci con il comando set. 93
  • 94. Matteo Collica - Shell Scripting (#!/bin/bash) - Debugging Debugging step-by-step: Set Il builtin set prevede due opzioni per attivare sia la modalità verbose che quella xtrace solo per alcune porzioni di codice. Sintassi Una volta specificato set -x o set -v ogni comando successivo verrà eseguito nella modalità specificata finché non si giunge al termine dello script o ad un comando set +x o set +v. 94
  • 95. Matteo Collica - Shell Scripting (#!/bin/bash) - Debugging95
  • 96. Matteo Collica - Shell Scripting (#!/bin/bash) - Debugging Debugging step-by-step: Echo L’uso del comando echo per controllare il contenuto di variabili, posizionato strategicamente all’interno di uno script, è spesso una soluzione più che valida per individuare eventuali malfunzionamenti. 96
  • 98. Crediti Un ringraziamento speciale alla disegnatrice che ha realizzato e rilasciato il template gratuitamente: ★ Template della presentazione scaricato da SlidesCarnival; disegnato da Jimena Catalina E ai creatori della guida da cui ho preso maggiormente ispirazione per la realizzazione di questa presentazione: ★ Shell Scripting e Bash: la Guida 98 Matteo Collica - Shell Scripting (#!/bin/bash) - Crediti