Il mio precedente articolo su “Comprensione e scrittura delle funzioni negli script di shell" potrebbe averti dato un'idea di base su come scrivere funzioni sotto script di shell. Ora è il momento di approfondire le funzionalità funzionali come l'uso delle variabili locali e la ricorsione.
Cosa rende locale una variabile? Dipende da quel particolare blocco in cui è dichiarata la variabile. Una variabile dichiarata come Locale sarà accessibile da quel blocco di codice in cui appare, ovvero il suo ambito è locale. Per spiegare questa cosa diamo un'occhiata a un esempio qui sotto.
#!/bin/bash func() { local i=10 j=20 echo "i from func = $i" echo "j from func = $j" } echo "i funzione esterna = $i" echo "j funzione esterna = $j" func echo "i funzione esterna = $i" echo "j funzione esterna = $j" uscita 0
All'esecuzione dello script sopra, l'output sarà.
i outside func = j outside func = i from func = 10 j from func = 20 i outside func = j outside func = 20
Questo perché la funzione funzione non ha ancora chiamato mentre il primi 2 sono state eseguite le istruzioni echo. Dopo aver chiamato la funzione funzione lo stesso 2 dichiarazioni eco produrre un risultato diverso. Ora la variabile J, che è stato dichiarato all'interno funzione e non locale, è possibile accedervi in seguito.
Quindi valore per J diventa 20. E la variabile locale? io? Poiché il suo scopo era all'interno della funzione funzione, valore 10 non si poteva accedere dall'esterno. Nota che la variabile J normalmente dichiarato all'interno funzione è globale per impostazione predefinita.
Ora hai familiarità con le variabili locali e come usarle all'interno dei blocchi funzione. Passiamo alla sezione più interessante sotto le funzioni, la ricorsione.
Una funzione che chiama se stessa è generalmente definita procedura di ricorsione. Oppure può essere definito come l'espressione di un algoritmo utilizzando una versione più semplice di quello stesso algoritmo. Considera l'esempio di trovare il fattoriale di un numero. Lo sappiamo n! = 1 x 2 x 3 x … x (n-1) x n. Quindi possiamo scrivere una relazione di ricorrenza come:
n! = (n-1)! x n
Quindi è facile per noi chiamare ricorsivamente la stessa funzione e utilizzare il valore restituito da ogni chiamata per moltiplicare con il risultato precedente, ad es.
5! = 4! x 5. 4! = 3! x 4. 3! = 2! x3. 2! = 1! x2. 1! = 0! x 1
Qui proviamo a scrivere uno script per trovare il fattoriale di un numero usando variabili locali e ricorsione.
#!/bin/bash fact() { num locale=$1 if [ $num -eq 0 ]; then ret=1 else temp=$((num-1)) fact $temp ret=$((num*$?)) fi return $ret } fact 5 echo "Fattore di 5 = $?" esci 0
numero è una variabile locale utilizzata per memorizzare ciascuno n-1 valore ad ogni chiamata. Qui la condizione di base controlla se il numero è uguale a zero o meno (poiché 0! = 1 e il fattoriale non è definito per i numeri negativi). Arrivando a questa condizione di base restituisce il valore 1 al suo chiamante. Ora numero = 1 e ret = 1 x 1.
In questo istante ritorna 1 al suo chiamante. Ora numero = 2 e ret = 2 x 1 e così via. Finalmente quando numero = 5 il valore di ritorno sarà 24 e il risultato finale è ret = 5 x 24. Il risultato finale 120 viene passato all'istruzione del chiamante iniziale e viene visualizzato.
C'è un problema nello script sopra. Come ho spiegato nell'articolo precedente, le funzioni non possono restituire numeri interi grandi. Quindi è lasciato agli utenti trovare una soluzione per il problema di cui sopra.
Q. Possiamo eseguire la ricorsione senza utilizzare le variabili locali? La risposta è sì.
Guarda il seguente esempio per visualizzare il serie di Fibonacci usando la ricorsione. La relazione di ricorrenza di base è:
fib (0) = 0 fib (1) = 1 altrimenti fib (n) = fib (n-1) + fib (n-2) Serie di Fibonacci che usa la ricorsione #!/bin/bash fib( ) { a=$1 if [ $a -lt 2 ]; then echo $a else ((--a)) b=$(fib $a) ((--a)) c=$(fib $a) echo $((b+c)) fi } for i in $ (seq 0 15) do out=$(fib $i) echo $out done exit 0
Nello script precedente non vengono utilizzate variabili locali. Spero che tu possa capire il flusso dello script durante l'esecuzione.
Qui il valore 15 rappresenta il numero di termini nel serie di Fibonacci da visualizzare. Hai notato qualcosa di speciale per quanto riguarda l'esecuzione dello script di cui sopra. Ci vuole un po', vero? La ricorsione in uno script è più lenta di una ricorsione in linguaggi di programmazione come C.
Con questo articolo, ho intenzione di concludere la parte delle funzioni nello scripting della shell. Rimani aggiornato con Tecmint per avere i prossimi articoli su array e altro ancora…