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