Il valore della funzione in Bash

PETSCIIBOTS-1

Gli script Bash sono comodi, versatili, utilissimi ma a volte… Esempio (puramente didascalico, non realistico, nèh!): il prodotto di due numeri, in Python posso scriverlo così (file per.py):

#:/usr/bin/python3

def per(na, nb):
    res = na * nb
    return res

# test

r1 = per(6, 7)
print(r1)

r2 = per(3.7, 7.3)
print(r2)

Un pythonista produrrebbe un codice più sintetico ma sono sul didattico. Eseguendolo ottengo

$ python3 per.py
42
27.01
$

OK, funziona sia con gli interi che con i reali. In Bash c’è l’istruzione return ma non è quello che serve: ritorna l’exit code della funzione, un intero compreso in [0..256]. In effetti in Bash l’equivalente di return degli usuali linguaggi non manca, bisogna ricorrere a una qualche rimedio, ce n’è almeno uno facilmente usabile: usare una variabile, viene vista globalmente, il codice diventa (file per.sh):

#/bin/bash

function per () {
    res=$(echo "$1 * $2" | bc -l)
}

# test

per 6 7
echo $res

per 3.7 7.3
echo $res

Eseguo:

$ bash per.sh
42
27.01
$

Credo serva qualche chiarimento.

  • la definizione do funzione inizia con function seguita da nome, coppia di parentesi () senza gli argomenti e graffa aperta {. Nel nostro caso function per () {. È però possibile omettere la parola function, la riga diventa: per () {;
  • gli argomenti all’interno della funzione vengono visti come $1, $2, ...;
  • nel caso in esame siamo costretti a usare bc perché vogliamo trattare (anche) numeri reali; inoltre il carattere * verrebbe interpretato da echo per cui occorre racchiudere l’espressione tra virgolette. Ma posso usare varianti, p.es: res=$(echo $1 "*" $2 | bc -l), res=$(echo $1 \* $2 | bc -l);
  • al posto di $(…) posso usare la vecchia sintassi, sconsigliata da POSIX: res=`echo $1 \* $2 | bc -l`;
  • la funzione viene chiamata con il nome seguito dai parametri separati da spazio, p.es: per 6 7;
  • la variabile usata per ritornare il valore della funzione, in questo caso res, è visibile al ritorno dalla funzione.

È possibile avere funzioni che ritornano più valori, ecco magmin.sh:

#/bin/bash

magmin () {
    st=$1
    res1=${st^^}
    res2=${st,,}
}

# test

magmin "Stringa MAG e min 💥"
echo $res1
echo $res2

che produce

$ bash magmin.sh
STRINGA MAG E MIN 💥
stringa mag e min 💥
$

Nota: si può evitare l’uso della variabile di supporto st, l’espressione res1=${1^^} funziona ma, secondo me, è meno chiara.

Quindi, in conclusione: è possibile usare funzioni in Bash come negli altri linguaggi di script (Python, JavaScript, …). Ma è pratico? Con tutte le alternative liberamente disponibili è da valutare caso per caso.

Posta un commento o usa questo indirizzo per il trackback.

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.

%d blogger hanno fatto clic su Mi Piace per questo: