Articolo originale: Shell Scripting for Beginners – How to Write Bash Scripts in Linux
Lo Shell scripting è una parte importante del processo di automazione in Linux. Lo scripting ti aiuta a scrivere sequenze di comandi in un file, per poi eseguirli.
Questo ti fa risparmiare tempo, in quanto non devi scrivere tutte le volte certi comandi. Puoi eseguire attività giornaliere con efficienza e anche pianificarle per una esecuzione automatica.
Puoi anche impostare certi script per essere eseguiti all'avvio come ad esempio mostrare un particolare messaggio quando si lancia una nuova sessione oppure impostare determinate variabili di ambiente.
Le applicazioni e gli utilizzi dello scripting sono numerosi, quindi iniziamo subito.
In questo articolo imparerai:
- Cos'è una shell bash.
- Cos'è uno script bash e come identificarlo.
- Come creare ed eseguire il tuo primo script bash.
- La sintassi base dello shell scripting.
- Come scoprire gli script pianificati in un sistema.
- Come automatizzare gli script pianificandoli tramite job di cron.
Il modo migliore per apprendere è l'esercizio. Ti consiglio vivamente di seguire gli esempi dell'articolo usando Replit. Puoi avere accesso a una shell di Linux in esecuzione nel giro di minuti.
Introduzione alla Shell Bash
La riga di comando di Linux è fornita da un programma chiamato shell. Nel corso degli anni, questo programma si è evoluto per soddisfare diverse esigenze.
Utenti diversi possono essere configurati per utilizzare shell diverse. Tuttavia la maggior parte degli utenti preferisce rimanere con la shell predefinita, che per molte distribuzioni Linux è la GNU Bourne-Again Shell (bash). Bash ha sostituito la Bourne shell (sh).
Quando la shell viene lanciata, utilizza uno script di partenza che si trova nel file .bashrc
o nel file .bash_profile
nella tua directory home, che ti consente di personalizzare il comportamento della shell.
Quando una shell è usata in modo interattivo, viene mostrato il simbolo $
quando è in attesa di un comando dall'utente. Questo è chiamato prompt della shell.
[username@host ~]$
Se la shell viene eseguita dall'utente come root, il prompt viene modificato in #
. Il prompt della shell del superuser assomiglia a questo:
[root@host ~]#
Bash è molto potente e può semplificare alcune operazioni che sono difficilmente realizzabili con una GUI (Interfaccia Utente Grafica). Ricorda che molti server non hanno una GUI, ed è meglio imparare a usare la potenza di una interfaccia da riga di comando (CLI).
Cos'è uno Script Bash
Uno script bash è una serie di comandi scritti in un file, che vengono letti ed eseguiti dal programma bash, riga per riga.
Per esempio, puoi portarti in un certo percorso, creare una cartella e generare un processo al suo interno usando la riga di comando.
Puoi eseguire la stessa sequenza di passi salvando i comandi in uno script bash, quindi eseguendolo. Non ci sono limiti al numero di volte nelle quali puoi eseguire lo script.
Come Identificare uno Script Bash
Estensione file .sh
.
Per convenzione di denominazione, gli script bash hanno un'estensione .sh
. Tuttavia gli script bash possono essere eseguiti senza problemi anche senza l'estensione sh
.
Script che iniziano con bash bang.
Gli script sono anche identificati con uno shebang
al loro interno. Shebang è la combinazione dei termini inglesi bash #
e bang !
seguito dal percorso della shell bash. Questa è la prima riga dello script. Shebang dice alla shell di eseguire lo script tramite la shell bash. Shebang è semplicemente il percorso assoluto all'interprete bash.
Di seguito un esempio di una istruzione shebang.
#! /bin/bash
Il percorso del programma bash può variare. Vedremo in seguito come identificarlo.
Permessi di esecuzione
Gli script hanno permessi di esecuzione per l'utente che li esegue.
Un permesso di esecuzione è rappresentato da una x
. Nell'esempio che segue l'utente "zaira" ha permessi di lettura, scrittura, esecuzione (rwx
) per il file test_script.sh

Colorazione del file
Nella maggior parte delle shell delle distribuzioni Linux, gli script eseguibili appaiono in colori diversi rispetto al resto di file e cartelle.
Nel mio caso gli script con privilegi di esecuzione appaiono di colore verde.

Come Creare il Tuo Primo Script Bash
Creiamo un semplice script in bash che stampa Hello World
.
Crea un file chiamato hello_world.sh
touch hello_world.sh
Trova il percorso della tua shell bash
which bash

Nel mio caso il percorso è /usr/bin/bash
, che includerò nello shebang.
Scrivi il comando
Stamperemo con il comando echo
"hello world" alla console.
Il nostro script è il seguente:
#! usr/bin/bash
echo "Hello World"
Modifica il file hello_world.sh
usando un editor testo di tua scelta e aggiungi le righe qui sopra.
Fornisci permessi di esecuzione al tuo utente
Modifica i permessi del file per consentire l'esecuzione dello script tramite il comando seguente:
chmod u+x hello_world.sh
chmod
modifica i permessi esistenti di un file per un dato utente. Stiamo aggiungendo +x
all'utente che è proprietario del file (u
).
Eseguire lo script
Puoi eseguire lo script nei seguenti modi:
./hello_world.sh
(se il file ha permessi di esecuzione)
bash hello_world.sh
(non è necessario che il file abbia permessi di esecuzione)
Ecco il risultato:

La Sintassi Base dello Scripting Bash
Proprio come ogni altro linguaggio di programmazione, lo scripting bash segue un insieme di regole per creare programmi che possono essere compresi dal computer. In questa sezione, studieremo la sintassi dello scripting bash.
Come definire variabili
Possiamo definire una variabile usando la sintassi nome_variabile=valore
. Per ottenere il valore di una variabile aggiungi $
davanti al nome della stessa.
#!/bin/bash
# Un semplice esempio di variabili
saluto=Ciao
nome=Tux
echo $saluto $nome

Tux è il nome della mascotte di Linux, il pinguino.

Espressioni Aritmetiche
Sotto sono indicati gli operatori supportati da bash per le operazioni di calcolo matematico:
OPERATORE | UTILIZZO |
---|---|
+ | addizione |
- | sottrazione |
* | moltiplicazione |
/ | divisione |
** | esponenziale |
% | resto |
Eseguiamo qualche esempio.

Le espressioni numeriche possono anche essere calcolate e salvate in una variabile usando la sintassi seguente:
variabile=$((espressione))
Proviamo un esempio:
#!/bin/bash
var=$((3+9))
echo $var

Le frazioni non sono calcolate correttamente utilizzando i metodi di cui sopra e sono troncate.
Per calcoli decimali possiamo usare il comando bc
per ottenere il risultato con un determinato numero di cifre decimali. bc
(Bash Calculator) è una calcolatrice da riga di comando che supporta calcoli fino a un certo numero di posizioni decimali.
echo "scale=2;22/7" | bc
Dove scale
definisce il numero di posizioni decimali richieste nel risultato.

Come leggere l'input utente
Talvolta occorre acquisire un input utente per eseguire certe operazioni.
In bash, possiamo ottenere l'input dall'utente con il comando read
.
read nome_variabile
Per mostrare all'utente un messaggio personalizzato usa l'opzione -p
.
read -p "Digita la tua età" nome_variabile
Esempio:
#!/bin/bash
echo "Digita un numero"
read a
echo "Digita un numero"
read b
var=$((a+b))
echo $var

Operatori logici per confronti numerici
Il confronto viene usato per verificare se le istruzioni si valutano come vere o false. Possiamo usare gli operatori qui sotto per confrontare due istruzioni:
OPERAZIONE | SINTASSI | DESCRIZIONE |
---|---|---|
Uguaglianza | num1 -eq num2 | num1 è uguale a num2 |
Maggiore di o uguale a | num1 -ge num2 | num1 è maggiore di o uguale a num2 |
Maggiore di | num1 -gt num2 | num1 è maggiore di num2 |
Minore di o uguale a | num1 -le num2 | num1 è minore di o uguale a num2 |
Minore di | num1 -lt num2 | num1 è minore di num2 |
Non Uguale a | num1 -ne num2 | num1 non è uguale a num2 |
Sintassi:
if [ condizioni ]
then
comandi
fi
Esempio:
Confrontiamo due numeri e troviamo qual è la loro relazione:
#!/bin/bash
read x
read y
if [ $x -gt $y ]
then
echo X è maggiore di Y
elif [ $x -lt $y ]
then
echo X è minore di Y
elif [ $x -eq $y ]
then
echo X è uguale a Y
fi
Output:

Istruzioni Condizionali (Processo Decisionale)
Le condizioni sono espressioni che sono valutate come un'espressione booleana. Per verificare la condizione possiamo usare if
, if-else
, if-elif-else
, anche annidati.
La struttura delle istruzioni condizionali è la seguente:
if...then...fi
istruzioniif...then...else...fi
istruzioniif..elif..else..fi
if..then..else..if..then..fi..fi..
(condizionali annidati)
Sintassi:
if [[ condizione ]]
then
istruzione
elif [[ condizione ]]; then
istruzione
else
fai questo per default
fi
Per creare confronti significativi possiamo usare AND -a
e OR -o
.
L'istruzione seguente si traduce in: se a
è maggior di 40 e b
è minore di 6.
if [ $a -gt 40 -a $b -lt 6 ]
Esempio: troviamo il tipo di triangolo leggendo le lunghezze dei suoi lati.
#!/bin/bash
read a
read b
read c
if [ $a == $b -a $b == $c -a $a == $c ]
then
echo EQUILATERO
elif [ $a == $b -o $b == $c -o $a == $c ]
then
echo ISOSCELE
else
echo SCALENO
fi
Risultato:
Caso di test #1

Caso di test #2

Caso di test #3

Cicli
I cicli for ti consentono di eseguire istruzioni per uno specifico numero di volte.
Eseguire cicli con i numeri:
Nell'esempio che segue il ciclo verrà eseguito per 5 volte.
#!/bin/bash
for i in {1..5}
do
echo $i
done

Eseguire cicli con le stringhe:
Possiamo eseguire cicli anche con le stringhe.
#!/bin/bash
for X in verde bianco rosso
do
echo $X
done

Cicli while
I cicli while verificano una condizione ed eseguono il ciclo fino a quando la condizione rimane vera. Occorre fornire un'istruzione che incrementi un contatore per controllare l'esecuzione del ciclo.
Nell'esempio qui sotto (( i += 1 ))
è l'istruzione che gestisce il contatore, che viene incrementato del valore di i
.
Esempio:
#!/bin/bash
i=1
while [[ $i -le 10 ]] ; do
echo "$i"
(( i += 1 ))
done

Leggere file
Supponi di avere un file file_di_esempio.txt
che contiene quanto segue:

Possiamo leggere il file riga per riga e stampare il risultato nella console.
#!/bin/bash
LINE=1
while read -r CURRENT_LINE
do
echo "$LINE: $CURRENT_LINE"
((LINE++))
done < "file_di_esempio.txt"
Risultato:

Come eseguire comandi racchiusi tra caratteri backtick (accento grave)
Se devi includere il risultato di un comando complesso nel tuo script, puoi scrivere l'istruzione racchiusa tra caratteri backtick (`)
Sintassi:
var= ` commandi
`
Esempio: supponi di voler ottenere il risultato di un elenco di punti di mount che contengono tmpfs
nel loro nome. Possiamo confezionare un'istruzione come questa: df -h | grep tmpfs
.
Per includerla nello script bash e ottenerne il risultato, possiamo racchiuderla tra caratteri backtick.
#!/bin/bash
var=`df -h | grep tmpfs`
echo $var
Risultato:

Come ottenere argomenti per gli script da riga di comando
È possibile passare argomenti allo script per l'esecuzione.
$@
rappresenta la posizione dei parametri, a partire da uno.
#!/bin/bash
for x in $@
do
echo "Il parametro digitato è $x"
done
Eseguilo in questo modo:
./nome_script arg1 arg2

Come Automatizzare gli Script Pianificandoli con Job di cron
Cron è un'utilità presente nei sistemi Unix che consente di pianificare delle attività (job). Si possono pianificare job per un'esecuzione giornaliera, settimanale, mensile o a un dato momento del giorno. L'automazione in Linux si appoggia pesantemente sui job di cron.
Di seguito la sintassi per pianificare un job in cron:
# Esempio di job per Cron
* * * * * sh /percorso/dello/script.sh
Qui gli asterischi rappresentano rispettivamente il minuto, l'ora, il giorno del mese, il mese, il giorno della settimana.
Qui sotto alcuni esempi di pianificazione di job.
PIANIFICAZIONE | DESCRIZIONE |
---|---|
5 0 * 8 * | Alle 00:05 di ogni giorno in agosto |
5 4 * * 6 | Alle 04:05 di ogni sabato |
0 22 * * 1-5 | Alle 22:00 di ogni giorno della settimana da lunedì a venerdì |
Puoi avere maggiori informazioni su cron leggendo questa guida.
Come Verificare Script Già Esistenti in un Sistema
Usare crontab
crontab -l
elenca gli script già pianificati per l'utente connesso.

Usare il comando find
Il comando find
aiuta a localizzare dei file in base a certi modelli. Visto che la maggior parte degli script ha estensione .sh
, possiamo usare il comando find per trovare degli script in questo modo:
find . -type f -name "*.sh"
Dove:
.
rappresenta la directory corrente, ma puoi modificare il percorso secondo necessità-type f
indica che il tipo di file che stiamo cercando è un file di testo*.sh
dice di trovare corrispondenza con tutti i file il cui nome finisce per.sh
.

Se vuoi saperne di più circa il comando find puoi consultare questo articolo.
Riepilogo
In questo tutorial abbiamo imparato le basi dello shell scripting. Abbiamo esaminato esempi e sintassi che possono esserci utili per scrivere programmi.
Cosa preferisci tra quello che hai imparato in questo tutorial? Fammelo sapere su Twitter!
Puoi leggere i miei altri post qui.