Introduzione

Una funzione Bash è essenzialmente un insieme di comandi che possono essere richiamati più volte. Lo scopo di una funzione è aiutarti a rendere più leggibili i tuoi script bash ed evitare di scrivere più volte lo stesso codice.

Rispetto alla maggior parte dei linguaggi di programmazione, le funzioni di Bash sono piuttosto limitate. In questo tutorial, tratteremo le basi delle funzioni di Bash e ti mostreremo come usarle negli script della shell.

Dichiarazione della funzione Bash

La sintassi per dichiarare una funzione bash è molto semplice. Possono essere dichiarati in due diversi formati.

Il primo formato inizia con il nome della funzione, seguito da parentesi. Questo è il formato preferito e più usato.

function_name () {
  commands
}

Versione a riga  singola:

function_name () { commands; }

Il secondo formato inizia con la parola function riservata seguita dal nome della funzione.

function function_name {
  commands
}

Versione a riga singola:

function function_name { commands; }

Da notare:

  • L'elenco dei comandi tra parentesi graffe  {} è il corpo della funzione. Le parentesi graffe che circondano il corpo della funzione devono essere separate dal corpo da spazi o nuove linee.
  • La definizione di una funzione non la esegue. Per invocare una funzione bash, utilizzare semplicemente il nome della funzione. I comandi tra le parentesi graffe vengono eseguiti ogni volta che la funzione viene chiamata nello script della shell.
  • La definizione della funzione deve essere inserita prima di qualsiasi chiamata alla funzione.
  • Quando si utilizzano le funzioni "compattate" a riga singola, un punto e virgola ; deve seguire l'ultimo comando della funzione.
  • Dovresti sempre cercare di mantenere descrittivi i nomi delle tue funzioni.

Per capirlo meglio, dai un'occhiata al seguente esempio:

#!/bin/bash

hello_world () {
   echo 'hello, world'
}

hello_world

Analizziamo il codice riga per riga:

  • Alla riga 3 stiamo definendo la funzione assegnandole un nome e aprendo la parentesi graffa { che segna l'inizio del corpo della funzione.
  • La riga 4 è il corpo della funzione. Il corpo della funzione può contenere più comandi e dichiarazioni variabili.
  • Riga 5, la parentesi graffa di chiusura }, definisce la fine della funzione hello_world.
  • Alla riga 7 stiamo eseguendo la funzione. È possibile eseguire la funzione tutte le volte che è necessario.

Se si esegue lo script, verrà stampato hello, world.

Variabili Scope

Le variabili globali sono variabili a cui è possibile accedere da qualsiasi punto dello script indipendentemente dall'ambito. In Bash, tutte le variabili di default sono definite globali, anche se dichiarate all'interno della funzione.

Le variabili locali possono essere dichiarate nel corpo della funzione con la parola chiave local e possono essere utilizzate solo all'interno di tale funzione. Puoi avere variabili locali con lo stesso nome in diverse funzioni.

Per illustrare meglio come funziona l'ambito delle variabili in Bash, consideriamo un esempio:

#!/bin/bash

var1='A'
var2='B'

my_function () {
  local var1='C'
  var2='D'
  echo "Inside function: var1: $var1, var2: $var2"
}

echo "Before executing function: var1: $var1, var2: $var2"

my_function

echo "After executing function: var1: $var1, var2: $var2"

Lo script inizia definendo due variabili globali var1 e var2. Quindi una funzione che imposta una variabile locale var1 e modifica la variabile globale var2.

Se esegui lo script, dovresti vedere il seguente output:

Before executing function: var1: A, var2: B
Inside function: var1: C, var2: D
After executing function: var1: A, var2: D

Dall'output sopra, possiamo concludere che:

  • Se si imposta una variabile locale all'interno del corpo della funzione con lo stesso nome di una variabile globale esistente, avrà la precedenza sulla variabile globale.
  • Le variabili globali possono essere modificate all'interno della funzione.

Valori di return

A differenza delle funzioni nei linguaggi di programmazione "reali", le funzioni di Bash non consentono di restituire un valore quando vengono chiamate. Quando una funzione bash viene completata, il suo valore restituito è lo stato dell'ultima istruzione eseguita nella funzione, il valore 0 indica il successo della funzione, mentre un numero decimale diverso da zero nell'intervallo 1 - 255 indica un errore.

Lo stato di ritorno può essere specificato utilizzando la parola chiave return ed è assegnato alla variabile $?. L'istruzione return termina la funzione. Puoi considerarlo come lo stato di uscita della funzione.

#!/bin/bash

my_function () {
  echo "some result"
  return 55
}

my_function
echo $?
some result
55

Per restituire effettivamente un valore arbitrario da una funzione, dobbiamo usare altri metodi. L'opzione più semplice è assegnare il risultato della funzione a una variabile globale:

#!/bin/bash

my_function () {
  func_result="some result"
}

my_function
echo $func_result
some result

Un'altra opzione migliore per restituire un valore da una funzione è inviare il valore a stdout usando echo o printf come mostrato di seguito:

#!/bin/bash

my_function () {
  local func_result="some result"
  echo "$func_result"
}

func_result="$(my_function)"
echo $func_result
some result

Invece di eseguire semplicemente la funzione che stamperà il messaggio su stdout, stiamo assegnando l'output della funzione alla variabile func_result usando la sostituzione del comando $(). La variabile può essere successivamente utilizzata secondo necessità.

Passare argomenti alle funzioni Bash

Per passare un numero qualsiasi di argomenti alla funzione bash, inseriscili subito dopo il nome della funzione, separati da uno spazio. È buona norma citare due volte gli argomenti per evitare di analizzare erroneamente un argomento con spazi all'interno.

  • I parametri passati sono $1, $2, $3... $n, corrispondente alla posizione del parametro dopo il nome della funzione.
  • La variabile $0 è riservata al nome della funzione.
  • La variabile $# contiene il numero di parametri / argomenti posizionali passati alla funzione.
  • Le variabili $* e [email protected] contengono tutti i parametri / argomenti posizionali passati alla funzione.
  • Quando è racchiuso tra virgolette doppie, "$*" si espande in una singola stringa separata dallo spazio (il primo carattere di IFS) - "$1 $2 $n".
  • Quando è racchiuso tra virgolette doppie, "[email protected]" si espande in stringhe separate - "$1" "$2" "$n".
  • Quando non è doppio citato, $* e [email protected] sono gli stessi.

Ecco un esempio:

#!/bin/bash

greeting () {
  echo "Hello $1"
}

greeting "Joe"
Hello Joe

Conclusione

Una funzione Bash è un blocco di codice riutilizzabile progettato per eseguire una particolare operazione. Una volta definita, la funzione può essere richiamata più volte all'interno di uno script.

Puoi anche leggere come utilizzare una funzione Bash per creare un alias con bash.