3 funzioni bash
Le funzioni sono routine di codice indipendenti che ci permettono di definire quali righe di codice eseguire quando vengono invocate.
Vengono definite tramite la parola riservata function seguita dal nome che vogliamo dare alla funzione e il codice che vogliamo eseguire racchiuso tra parentesi graffe { }
function print_hello { printf "Hello\n" }
abbiamo appena definito la funzione print_hello che esegue la stampa della parola Hello.
A questo punto la funzione è disponibile nel nostro script, per richiamarla basta semplicemente scriverne il nome.
function print_hello { printf "Hello\n" } print_hello
L’invocazione delle funzioni, a differenza di altri linguaggi di programmazione, deve essere effettuata dopo la sua definizione.
Argomenti
Gli argomenti sono dei parametri che posso passare alla funzione.
Si indicano inserendo il simbolo dollaro $ seguito dal numero di argomenti che vogliamo passare partendo dal numero 1 ( $1 , $2, $3 per passare 3 argomenti) nel unto in cui vogliamo che l’argomento venga inserito
function print_hello { printf "Hello $1\n" }
Ho inserito un argomento, ora devo aggiungerlo nel richiamo della funzione
print_hello $1
adesso quando lancio lo script, posso passare l’argomento che voglio
./function.sh World
stamperà il classico Hello World. Passiamo un secondo argomento
function print_hello { printf "Hello $1$2\n" } print_hello $1 $2
Ogni argomento aggiuntivo può essere dichiarato aggiungendo uno spazio. Ora lancio lo script passando 2 parametri
./function.sh World !
Ovviamente stamperà Hello World!
Il parametro zero ( $0 ) confine il nome dello script stesso
echo $0
Stampa in console ./function.sh.
Gli argomenti passati alle funzioni in bash operano come i comandi di bash, ovvero posizionando gli elementi come parametri posizionali, facciamo un esempio con una somma
function sum { let result=$1+$2 printf "$1 + $2 uguale $result\n" } sum $1 $2
./function.sh 10 3
Le variabili dichiarate all’interno delle funzioni, sono disponibili nello script globalmente.
Qualora volessimo ridurre il loro scope per essere disponibili solo all’interno della funzione, dobbiamo definito tramite la parola local.
function sum { let local result=$1+$2 printf "$1 + $2 uguale $result\n" }
adesso per ampliare la funzione e costruirne uno più corposa, utilizziamo nuovi costrutti che spiegheremo più avanti, intanto creiamo 4 funzioni che eseguono le 4 operazioni elementari
function somma { let local result=$1+$2 printf "$1 + $2 uguale $result\n" } function moltiplica { let local result=$1*$2 printf "$1 * $2 uguale $result\n" } function sottrai { let local result=$1-$2 printf "$1 - $2 uguale $result\n" } function dividi { let local result=$1/$2 printf "$1 / $2 uguale $result\n" }
ora implementiamo la logica che se invocando la funzione con la parola somma invocheremo l’omonima funzione, con moltiplica idem e così via. Useremo i costrutti condizionali if else che spiegheremo più avanti
if [ "$1" == "somma" ]; then somma $2 $3
In questo caso se il parametro $1 passato allo script è uguale a somma, eseguo la funzione somma passando il secondo e terzo parametro passato al richiamo dello script
if [ "$1" == "somma" ]; then somma $2 $3 elif [ "$1" == "moltiplica" ]; then moltiplica $2 $3 elif [ "$1" == "sottrai" ]; then sottrai $2 $3 elif [ "$1" == "dividi" ]; then dividi $2 $3
aggiungiamo una stampa un errore in caso venga inserito un primo parametro diverso dai 4 esistenti.
L’operatore di slash ( \ ) davanti alle virgolette si usa per comunicare che ci sono altri doppi apici dentro ad altri
else printf "Operazione di \"$1\" sconosciuta, uscita.\n" exit 1
adesso il programma va bene, l’unica pecca e che se si inserisce una stringa sbagliata otteniamo solo il messaggio di errore, ma sarebbe utile dire all’utente di usare un –help per ottenere informazioni, aggiungendo il codice prima dell’else finale
elif [ "$1" == "--help" ] || [ "$1" == "-h" ] || [ "$1" == "--h" ]; then printf "Usa: \n" printf "./function.sh [ somma|moltiplica|dividi|sottrai] <arg1> <arg2> \n"
abbiamo messo le condizioni che se il primo argomento è uguale a –help oppure a -h oppure –h stampa le info. Da notare che oppure viene tradotto tramite l’operatore OR che si rappresenta con doppio pipe | |
ecco il codice completo
#!/bin/bash function somma { let local result=$1+$2 printf "$1 + $2 uguale $result\n" } function moltiplica { let local result=$1*$2 printf "$1 * $2 uguale $result\n" } function sottrai { let local result=$1-$2 printf "$1 - $2 uguale $result\n" } function dividi { let local result=$1/$2 printf "$1 / $2 uguale $result\n" } if [ "$1" == "somma" ]; then somma $2 $3 elif [ "$1" == "moltiplica" ]; then moltiplica $2 $3 elif [ "$1" == "sottrai" ]; then sottrai $2 $3 elif [ "$1" == "dividi" ]; then dividi $2 $3 elif [ "$1" == "--help" ] || [ "$1" == "-h" ] || [ "$1" == "--h" ]; then printf "Usa: \n" printf "./function.sh [ somma|moltiplica|dividi|sottrai] <arg1> <arg2> \n" else printf "Operazione di \"$1\" sconosciuta, Usa \"./function --help\" per info\n" exit 1 fi