Website-Suche

Vertiefung der Funktionskomplexitäten mit Shell-Scripting – Teil VII


Mein vorheriger Artikel über "Verstehen und Schreiben von Funktionen in Shell-Skripten" hat Ihnen vielleicht eine grundlegende Idee gegeben, wie Sie Funktionen unter Shell-Skripten schreiben können. Jetzt ist es an der Zeit, sich eingehender mit funktionalen Merkmalen wie der Verwendung lokaler Variablen und der Rekursion zu befassen.

Lokale Variablen

Was macht eine Variable lokal? Dies hängt von dem jeweiligen Block ab, in dem die Variable deklariert wird. Eine als lokal deklarierte Variable ist von dem Codeblock aus zugänglich, in dem sie angezeigt wird, d.h. ihr Gültigkeitsbereich ist lokal. Um diese Sache zu erklären, schauen wir uns unten ein Beispiel an.

#!/bin/bash 

func( ) { 
	local i=10 
	j=20 
	echo "i from func = $i" 
	echo "j from func = $j" 
} 

echo "i outside func = $i" 
echo "j outside func = $j" 

func 

echo "i outside func = $i" 
echo "j outside func = $j" 

exit 0

Beim Ausführen des obigen Skripts wird die Ausgabe angezeigt.

i outside func = 
j outside func = 
i from func = 10 
j from func = 20 
i outside func = 
j outside func = 20

Dies liegt daran, dass die Funktion func noch nicht aufgerufen hat, während die ersten 2 echo-Anweisungen ausgeführt wurden. Nach dem Aufruf der Funktion func erzeugen die gleichen 2 echo-Anweisungen ein anderes Ergebnis. Nun konnte nachträglich auf die Variable j zugegriffen werden, die innerhalb von func und nicht lokal deklariert wurde.

Somit wird der Wert für j zu 20. Was ist mit der lokalen Variablen i? Da sich der Gültigkeitsbereich innerhalb der Funktion func befand, konnte von außen nicht auf den Wert 10 zugegriffen werden. Beachten Sie, dass die Variable j, die normalerweise innerhalb von func deklariert wird, standardmäßig global ist.

Jetzt sind Sie mit lokalen Variablen vertraut und wissen, wie Sie sie innerhalb von Funktionsbausteinen verwenden. Kommen wir zum interessantesten Abschnitt unter Funktionen, der Rekursion.

Was ist Rekursion?

Eine Funktion, die sich selbst aufruft, wird im Allgemeinen als Rekursionsprozedur bezeichnet. Oder es kann so definiert werden, dass ein Algorithmus ausgedrückt wird, indem eine einfachere Version desselben Algorithmus verwendet wird. Betrachten Sie das Beispiel für die Ermittlung der Fakultät einer Zahl. Wir wissen, dass n!=1 x 2 x 3 x ... x (n-1) x n. Somit können wir eine Wiederholungsbeziehung wie folgt schreiben:

n! = (n-1)! x n

Es ist also einfach für uns, dieselbe Funktion rekursiv aufzurufen und den Rückgabewert aus jedem Aufruf zu verwenden, um mit dem vorherigen Ergebnis zu multiplizieren, d.h.

5! = 4! x 5
4! = 3! x 4
3! = 2! x 3
2! = 1! x 2
1! = 0! x 1

Rekursion mit lokalen Variablen

Hier versuchen wir, ein Skript zu schreiben, um die Fakultät einer Zahl mit Hilfe von lokalen Variablen und Rekursion zu finden.

#!/bin/bash 

fact( ) { 
	local num=$1 
	if [ $num -eq 0 ]; then 
		ret=1 
	else 
		temp=$((num-1)) 
		fact $temp 
		ret=$((num*$?)) 
	fi 
	return $ret 
} 

fact 5 

echo "Factorial of 5 = $?" 

exit 0

num ist eine lokale Variable, die verwendet wird, um jeden n-1-Wert bei jedem Aufruf zu speichern. Hier prüft die Basisbedingung, ob die Zahl gleich Null ist oder nicht (da 0!=1 und für negative Zahlen nicht faktoriell definiert ist). Beim Eintreffen dieser Basisbedingung gibt er den Wert 1 an seinen Aufrufer zurück. Nun ist num=1 und ret=1 x 1.

In diesem Moment gibt es 1 an seinen Aufrufer zurück. Nun ist num=2 und ret=2 x 1 und so weiter. Schließlich, wenn num=5 ist, ist der Rückgabewert 24 und das Endergebnis ret=5 x 24. Das Endergebnis 120 wird an die anfängliche Aufruferanweisung übergeben und angezeigt.

Es gibt ein Problem im obigen Skript. Wie ich im vorherigen Artikel erklärt habe, können Funktionen keine großen ganzen Zahlen zurückgeben. Es liegt also an den Benutzern, eine Lösung für das oben genannte Problem zu finden.

Q. Können wir eine Rekursion durchführen, ohne lokale Variablen zu verwenden? Die Antwort ist Ja.

Rekursion ohne lokale Variablen

Schauen Sie sich das folgende Beispiel für die Darstellung der Fibonacci-Reihe mit Hilfe der Rekursion an. Die grundlegende Wiederholungsbeziehung ist:

fib(0) = 0 
fib(1) = 1 
else 
	fib(n) = fib(n-1) + fib(n-2)

Fibonacci series using recursion

#!/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

Im obigen Skript werden keine lokalen Variablen verwendet. Ich hoffe, Sie können den Ablauf des Skripts während der Ausführung verstehen.

Hier stellt der Wert 15 die Anzahl der Terme in der Fibonacci-Reihe dar, die angezeigt werden sollen. Haben Sie etwas Besonderes an der Ausführung des obigen Skripts bemerkt? Das dauert eine Weile, nicht wahr? Die Rekursion in einem Skript ist langsamer als eine Rekursion in Programmiersprachen wie C.

Mit diesem Artikel plane ich, den Funktionsteil beim Shell-Scripting abzuschließen. Bleiben Sie mit Tecmint auf dem Laufenden, um die kommenden Artikel über Arrays und vieles mehr zu erhalten...

Verwandte Artikel: