Unix / Linux - Funzioni della shell
In questo capitolo, discuteremo in dettaglio delle funzioni della shell. Le funzioni consentono di suddividere la funzionalità complessiva di uno script in sottosezioni logiche più piccole, che possono quindi essere chiamate per eseguire le singole attività quando necessario.
Usare le funzioni per eseguire attività ripetitive è un ottimo modo per creare code reuse. Questa è una parte importante dei moderni principi di programmazione orientata agli oggetti.
Le funzioni della shell sono simili a subroutine, procedure e funzioni in altri linguaggi di programmazione.
Creazione di funzioni
Per dichiarare una funzione, usa semplicemente la seguente sintassi:
function_name () {
list of commands
}
Il nome della tua funzione è function_name, ed è quello che userete per chiamarlo da altrove nei vostri script. Il nome della funzione deve essere seguito da parentesi, seguito da un elenco di comandi racchiusi tra parentesi graffe.
Esempio
L'esempio seguente mostra l'uso della funzione:
#!/bin/sh
# Define your function here
Hello () {
echo "Hello World"
}
# Invoke your function
Hello
Dopo l'esecuzione, riceverai il seguente output:
$./test.sh
Hello World
Passare i parametri a una funzione
È possibile definire una funzione che accetterà parametri durante la chiamata della funzione. Questi parametri sarebbero rappresentati da$1, $2 e così via.
Di seguito è riportato un esempio in cui passiamo due parametri Zara e Ali e quindi acquisiamo e stampiamo questi parametri nella funzione.
#!/bin/sh
# Define your function here
Hello () {
echo "Hello World $1 $2"
}
# Invoke your function
Hello Zara Ali
Dopo l'esecuzione, riceverai il seguente risultato:
$./test.sh
Hello World Zara Ali
Restituzione di valori dalle funzioni
Se esegui un file exit comando dall'interno di una funzione, il suo effetto non è solo di terminare l'esecuzione della funzione ma anche del programma shell che ha chiamato la funzione.
Se invece vuoi semplicemente terminare l'esecuzione della funzione, allora c'è un modo per uscire da una funzione definita.
In base alla situazione puoi restituire qualsiasi valore dalla tua funzione usando il return comando la cui sintassi è la seguente -
return code
Qui code può essere qualsiasi cosa tu scelga qui, ma ovviamente dovresti scegliere qualcosa che sia significativo o utile nel contesto della tua sceneggiatura nel suo insieme.
Esempio
La seguente funzione restituisce un valore 10 -
#!/bin/sh
# Define your function here
Hello () {
echo "Hello World $1 $2"
return 10
}
# Invoke your function
Hello Zara Ali
# Capture value returnd by last command
ret=$?
echo "Return value is $ret"
Dopo l'esecuzione, riceverai il seguente risultato:
$./test.sh
Hello World Zara Ali
Return value is 10
Funzioni annidate
Una delle caratteristiche più interessanti delle funzioni è che possono chiamare se stesse e anche altre funzioni. Una funzione che chiama se stessa è nota comerecursive function.
L'esempio seguente mostra l'annidamento di due funzioni:
#!/bin/sh
# Calling one function from another
number_one () {
echo "This is the first function speaking..."
number_two
}
number_two () {
echo "This is now the second function speaking..."
}
# Calling function one.
number_one
Dopo l'esecuzione, riceverai il seguente risultato:
This is the first function speaking...
This is now the second function speaking...
Chiamata di funzione dal prompt
Puoi inserire definizioni per funzioni di uso comune all'interno del tuo file .profile. Queste definizioni saranno disponibili ogni volta che effettui l'accesso e potrai usarle dal prompt dei comandi.
In alternativa, puoi raggruppare le definizioni in un file, ad esempio test.she quindi eseguire il file nella shell corrente digitando -
$. test.sh
Questo ha l'effetto di provocare funzioni definite all'interno test.sh da leggere e definire nella shell corrente come segue:
$ number_one
This is the first function speaking...
This is now the second function speaking...
$
Per rimuovere la definizione di una funzione dalla shell, utilizzare il comando unset con l'estensione .fopzione. Questo comando viene utilizzato anche per rimuovere la definizione di una variabile dalla shell.
$ unset -f function_name