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:

  1. Cos'è una shell bash.
  2. Cos'è uno script bash e come identificarlo.
  3. Come creare ed eseguire il tuo primo script bash.
  4. La sintassi base dello shell scripting.
  5. Come scoprire gli script pianificati in un sistema.
  6. 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

image-98

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.

image-99

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
image-100

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:

Two ways to run scripts
Due modi di eseguire uno script

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
image-104

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

Hi, I am Tux.
Ciao, sono Tux.

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.

Note the spaces, these are part of the syntax
Nota che gli spazi sono parte della sintassi

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
image-109

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.

Getting output to 2 decimal places
Ottenere un risultato con due cifre decimali

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
image-111

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:

image-112

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 istruzioni
  • if...then...else...fi istruzioni
  • if..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

image-113

Caso di test #2

image-114

Caso di test #3

image-115

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
Looping-with-numbers

Eseguire cicli con le stringhe:

Possiamo eseguire cicli anche con le stringhe.

#!/bin/bash

for X in verde bianco rosso  
do
	echo $X
done
Looping-with-strings

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
image-153

Leggere file

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

image-151

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:

Lines with line number printed
Stampa del numero di riga seguito dal contenuto di ogni riga

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:

image-118

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

image-155

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.

My scheduled scripts
I miei script programmati

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.
image-159

Se vuoi saperne di più circa il comando find puoi consultare questo articolo.

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.