Introduzione
Una funzione bash è un metodo utilizzato negli script di shell per raggruppare blocchi di codice riutilizzabili. Questa funzione è disponibile per la maggior parte dei linguaggi di programmazione, conosciuti con nomi diversi come procedure, metodi o subroutine.
Questo articolo fornisce una panoramica completa delle funzioni bash, come funzionano e come utilizzarle.
Prerequisiti
- Un sistema che esegue Linux.
- Accesso al terminale e alla shell Bash.
- Un editor di testo per scrivere script bash (la guida utilizza Vim).
Cosa sono le funzioni Bash?
Una funzione bash è una tecnica per raggruppare bit di codice riutilizzabili sotto un nome per un uso successivo. La funzione bash è come uno script all'interno di uno script.
L'uso delle funzioni nello scripting bash comporta due vantaggi :
1. Una funzione viene letta direttamente nella memoria della shell e archiviata per un uso successivo. Dal momento che la memoria del computer non è un problema al giorno d'oggi, l'utilizzo delle funzioni è più veloce rispetto alla ripetizione del codice.
2. Le funzioni aiutano a organizzare lunghi script di shell in blocchi di codice modulari e riutilizzabili. I blocchi sono più facili da sviluppare e mantenere .
Come utilizzare le funzioni Bash?
Esistono due modi per implementare le funzioni Bash:
- All'interno di uno script di shell, dove la definizione della funzione deve essere prima di qualsiasi chiamata alla funzione.
- Accanto ad altri comandi alias bash e direttamente nel terminale come comando.
Per utilizzare le funzioni bash, segui i contorni seguenti.
Sintassi della funzione Bash
Esistono due modi diversi per dichiarare una funzione bash:
1. Il formato più utilizzato è:
<function name> () {
<commands>
}
In alternativa, la stessa funzione può essere una riga:
<function name> () { <commands>; }
2. Il modo alternativo per scrivere una funzione bash è usare la parola riservata function
:
function <function name> {
<commands>
}
O in una riga:
function <function name> { <commands>; }
Prendi nota dei seguenti comportamenti e suggerimenti quando utilizzi le funzioni:
- Quando si scrive in una riga, i comandi devono terminare con un punto e virgola (
;
), sia negli script bash che direttamente dal terminale. - Aggiunta della
function
la parola riservata rende le parentesi facoltative. - I comandi tra parentesi graffe
{ <commands> }
sono chiamati il corpo della funzione . Il corpo può contenere un numero qualsiasi di dichiarazioni, variabili, cicli o istruzioni condizionali. - Cerca di usare nomi descrittivi per le funzioni. Sebbene non siano necessari durante il test di funzioni e comandi, i nomi descrittivi aiutano nelle impostazioni in cui altri sviluppatori esaminano il codice.
Come dichiarare e chiamare una funzione?
Una funzione non viene eseguita quando dichiarata. Il corpo della funzione viene eseguito quando viene richiamato dopo la dichiarazione. Segui i passaggi seguenti per creare uno script bash con varie opzioni di sintassi:
1. Utilizzando il tuo editor di testo preferito, crea uno script di shell chiamato sintassi . Se stai usando Vim, esegui la seguente riga nel terminale:
vim syntax.sh
2. Aggiungi il codice seguente allo script della shell:
# syntax.sh
# Declaring functions using the reserved word function
# Multiline
function f1 {
echo Hello I\'m function 1
echo Bye!
}
# One line
function f2 { echo Hello I\'m function 2; echo Bye!; }
# Declaring functions without the function reserved word
# Multiline
f3 () {
echo Hello I\'m function 3
echo Bye!
}
# One line
f4 () { echo Hello I\'m function 4; echo Bye!; }
# Invoking functions
f4
f3
f2
f1
Lo script esegue le seguenti operazioni:
- Righe 4-9 dimostrare come definire una funzione usando la
function
parola riservata. La funzionef1
utilizza una sintassi multilinea nelle righe 4-6, mentref2
utilizza la sintassi di una riga sulla riga 9. - Righe 13-18 mostra la sintassi più familiare.
f3
è una funzione multilinea definita nelle righe 13-16, mentref4
sulla riga 18 è l'equivalente di riga singola. - Righe 21-24 richiamare le funzioni precedentemente definite ed eseguire i comandi nei corpi delle funzioni corrispondenti. Le chiamate vengono effettuate in ordine inverso rispetto alla definizione.
3. Salva lo script e chiudi Vim:
:wq
4. Crea il syntax.sh file eseguibile:
chmod +x syntax.sh
5. Infine, esegui lo script per vedere l'output:
./syntax.sh
Come dichiarare e chiamare una funzione nel terminale?
Per dichiarare e utilizzare una funzione nel terminale:
1. Apri il terminale e inserisci la seguente riga:
my_function () { echo "Hello I'm a function"; echo "Bye!"; }
2. Eseguire la funzione inserendo il nome della funzione nel terminale:
my_function
L'output esegue i comandi nel corpo della funzione.
La funzione rimane definita solo nella sessione del terminale corrente. Per salvare per sessioni future, aggiungi il codice a ~/.bashrc file.
Dov'è definita una funzione Bash?
Per vedere dove è definita una funzione bash e il suo contenuto, inserisci i seguenti comandi nel terminale:
1. Esegui la shell bash in modalità debugger:
bash --debugger
2. Controllare il file sorgente della funzione con:
declare -F <function name>
Ad esempio:
declare -F my_function
L'output stampa il nome della funzione, il numero di riga e la posizione del file in cui si trova la definizione della funzione.
3. Per vedere il contenuto della funzione, eseguire:
declare -f <function name>
Ad esempio:
declare -f my_function
La declare
la modalità di debug integrata consente di visualizzare il contenuto e la posizione della funzione senza eseguire il codice.
Come eliminare una funzione Bash?
Se hai bisogno di liberare uno spazio dei nomi occupato da una funzione nella sessione del terminale corrente, esegui:
unset <function name>
Ad esempio:
unset my_function
La funzione non è più disponibile nella sessione del terminale corrente. Tuttavia, se il codice è in ~/.bashrc file, tutto viene ripristinato alla normalità nella sessione successiva.
Variabili della funzione Bash
Le variabili in bash sono globali per impostazione predefinita e accessibili da qualsiasi luogo, inclusi i corpi delle funzioni. Anche le variabili definite all'interno di una funzione sono globali. Aggiunta della parola chiave local
rende il termine accessibile solo all'interno della funzione e delle funzioni/processi figlio.
In ambito dinamico , una variabile locale ombreggia una variabile globale quando le due portano lo stesso nome.
Prova il seguente script bash per dimostrare come funzionano le variabili di funzione in bash:
1. Crea uno script chiamato variable.sh :
vim variable.sh
2. Aggiungi il seguente codice allo script:
var1=1
var2=1
change() {
echo Inside function
echo Variable 1 is: $var1
echo Variable 2 is: $var2
local var1=5
var2=5
echo
echo After change inside function
echo Variable 1 is locally $var1
echo Variable 2 is globally $var2
}
echo Before function invocation
echo Variable 1 is: $var1
echo Variable 2 is: $var2
echo
change
echo
echo After function invocation
echo Variable 1 is: $var1
echo Variable 2 is: $var2
Lo script mostra quanto segue:
- Righe 1-2 dichiarare le variabili
var1
evar2
e impostali entrambi su1
. - Righe 5-6 sono all'interno del corpo della funzione e stampano le variabili sulla console. Poiché l'ambito della variabile è globale, vengono stampati i valori originali.
- Riga 7 dichiara una nuova variabile locale con lo stesso nome della variabile globale
var1
. Lalocal var1
oscura lavar1
globale valore dovuto all'ambito dinamico. - Riga 8 cambia il valore della
var2
globale variabile. - Righe 14-22 stampa i valori delle variabili prima e dopo aver chiamato la funzione.
3. Salva lo script ed esci da Vim:
:wq
4. Modifica le autorizzazioni del file in eseguibile:
chmod +x variable.sh
5. Eseguire lo script e analizzare i risultati:
./variable.sh
I valori delle variabili vengono stampati sulla console tramite le modifiche apportate allo script.
Argomenti della funzione Bash
Per passare argomenti a una funzione, aggiungi i parametri dopo la chiamata di funzione separati da spazi. La tabella seguente delinea le opzioni disponibili quando si lavora con gli argomenti della funzione bash.
Argomento | Ruolo |
---|---|
$0 | Riserva il nome della funzione quando definita nel terminale. Quando definito in uno script bash, $0 restituisce il nome e la posizione dello script. |
$1 , $2 , ecc. | Corrisponde alla posizione dell'argomento dopo il nome della funzione. |
$# | Contiene il conteggio degli argomenti posizionali passati alla funzione. |
[email protected] e $* | Mantieni l'elenco degli argomenti posizionali e funziona allo stesso modo se usato in questo modo. |
"[email protected]" | Espande l'elenco in stringhe separate. Ad esempio "$1", "$2" , ecc. |
"$*" | Espande l'elenco in un'unica stringa, separando i parametri con uno spazio. Ad esempio "$1 $2" ecc. |
Segui i passaggi seguenti per verificare come funzionano i vari argomenti in una funzione.
1. Crea uno script chiamato argomenti :
vim arguments.sh
2. Aggiungi il seguente codice nello script:
arguments () {
echo The function location is $0
echo There are $# arguments
echo "Argument 1 is $1"
echo "Argument 2 is $2"
echo "<[email protected]>" and "<$*>" are the same.
echo List the elements in a for loop to see the difference!
echo "* gives:"
for arg in "$*"; do echo "<$arg>"; done
echo "@ gives:"
for arg in "[email protected]"; do echo "<$arg>"; done
}
arguments hello world
3. Salva lo script ed esci da Vim:
:wq
4. Rendi eseguibile lo script:
chmod +x arguments.sh
5. Esegui lo script:
./arguments.sh
L'output mostra messaggi descrittivi per ogni argomento utilizzato.
Ritorno della funzione Bash
Le funzioni Bash differiscono dalla maggior parte dei linguaggi di programmazione quando si tratta di restituire un valore da una funzione. Per impostazione predefinita, bash restituisce lo stato di uscita dell'ultimo comando eseguito nel corpo della funzione.
Lo script seguente mostra come specificare lo stato di uscita utilizzando return:
1. Crea uno script e chiamalo test.sh :
vim test.sh
2. Aggiungi la seguente funzione al file:
test_function() {
echo Test
return 100
}
echo The function\'s output is:
test_function
echo The exit status is:
echo $?
3. Salva e chiudi l'editor di testo:
:wq
4. Modifica le autorizzazioni:
chmod +x test.sh
5. Eseguire lo script per vedere l'output della funzione e lo stato di uscita:
./test.sh
Un metodo alternativo è fare eco al risultato della funzione e assegnare l'output a una variabile. Modifica il test.sh script con il seguente codice:
test_function() {
echo Test
}
result=$(test_function)
echo $result is saved in a variable for later use
Questo metodo imita il funzionamento della maggior parte dei linguaggi di programmazione quando si utilizzano le funzioni.