Una funzione Bash è essenzialmente un insieme di comandi che possono essere richiamati numerose volte. Lo scopo di una funzione è aiutarti a rendere più leggibili i tuoi script bash ed evitare di scrivere ripetutamente lo stesso codice. Rispetto alla maggior parte dei linguaggi di programmazione, le funzioni di Bash sono alquanto limitate.
In questo tutorial, tratteremo le basi delle funzioni Bash e ti mostreremo come usarle negli script della tua shell.
Definizione delle funzioni Bash #
La sintassi per dichiarare una funzione bash è semplice. Le funzioni possono essere dichiarate in due diversi formati:
-
Il primo formato inizia con il nome della funzione, seguito da parentesi. Questo è il formato preferito e più utilizzato.
function_name () { commands }
Versione a riga singola:
function_name () { commands; }
-
Il secondo formato inizia con la parola riservata
function
, seguito dal nome della funzione.function function_name { commands }
Versione a riga singola:
function function_name { commands; }
Pochi punti da notare:
- I comandi tra parentesi graffe (
{}
) sono chiamati il corpo della funzione. Le parentesi graffe devono essere separate dal corpo da spazi o nuove righe. - La definizione di una funzione non la esegue. Per invocare una funzione bash, usa semplicemente il nome della funzione. I comandi tra 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 funzioni "compatte" a riga singola, un punto e virgola
;
deve seguire l'ultimo comando nella funzione. - Cerca sempre di mantenere i nomi delle tue funzioni descrittivi.
Per capirlo meglio, dai un'occhiata al seguente esempio:
~/hello_world.sh#!/bin/bash
hello_world () {
echo 'hello, world'
}
hello_world
Analizziamo il codice riga per riga:
- Nella riga 3, definiamo la funzione assegnandole un nome. La parentesi graffa
{
segna l'inizio del corpo della funzione. - Riga
4
è il corpo della funzione. Il corpo della funzione può contenere più comandi, istruzioni e dichiarazioni di variabili. - Riga
5
, la parentesi graffa di chiusura}
, definisce la fine delhello_world
funzione. - Nella riga
7
stiamo eseguendo la funzione. Puoi eseguire la funzione tutte le volte che vuoi.
Se esegui lo script, stamperà hello, world
.
Ambito variabili #
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 all'interno del corpo della funzione con local
parola chiave e può essere utilizzato solo all'interno di quella funzione. Puoi avere variabili locali con lo stesso nome in diverse funzioni.
Per illustrare meglio come funziona l'ambito delle variabili in Bash, consideriamo questo esempio:
~/variables_scope.sh#!/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
. Poi c'è 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:
- Quando una variabile locale è impostata 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 dall'interno della funzione.
Valori di ritorno #
A differenza delle funzioni nei linguaggi di programmazione "reali", le funzioni 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, 0
per il successo e numero decimale diverso da zero nell'intervallo 1 - 255 per il fallimento.
Lo stato del reso può essere specificato utilizzando il return
parola chiave, ed è assegnato alla variabile $?
. Il return
istruzione termina la funzione. Puoi pensarlo 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:
~/return_values.sh#!/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 echoor 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 a func_result
variabile usando il $()
sostituzione del comando. La variabile può essere utilizzata in seguito secondo necessità.
Passaggio di argomenti a funzioni Bash #
Per passare un numero qualsiasi di argomenti alla funzione bash è sufficiente inserirli subito dopo il nome della funzione, separati da uno spazio. È buona norma citare gli argomenti tra virgolette per evitare di spargere in modo errato un argomento contenente degli spazi.
- I parametri passati sono
$1
,$2
,$3
…$n
, corrispondente alla posizione del parametro dopo il nome della funzione. - Il
$0
variabile è riservata al nome della funzione. - Il
$#
variabile contiene il numero di parametri/argomenti posizionali passati alla funzione. - Il
$*
e$@
le variabili contengono tutti i parametri/argomenti posizionali passati alla funzione.- In caso di doppia virgoletta,
"$*"
si espande in una singola stringa separata da uno spazio (il primo carattere di IFS) -"$1 $2 $n"
. - In caso di doppia virgoletta,
"$@"
si espande in stringhe separate -"$1" "$2" "$n"
. - Se non doppia,
$*
e$@
sono gli stessi.
- In caso di doppia virgoletta,
Ecco un esempio:
~/passing_arguments.sh#!/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.
Potresti anche voler leggere come utilizzare una funzione Bash per creare un comando di scelta rapida memorabile per un comando più lungo.
Se hai domande o feedback, sentiti libero di lasciare un commento.