Tiefer in die Funktionskomplexität mit Shell Scripting - Teil VII
- 2806
- 674
- Levke Harnapp
Mein vorheriger Artikel über „Verstehen und Schreiben von Funktionen in Shell -Skripten“ hat Ihnen möglicherweise eine grundlegende Idee zum Schreiben von Funktionen unter Shell -Skripten gegeben. Jetzt ist es an der Zeit, sich tiefer in funktionale Merkmale wie die Verwendung lokaler Variablen und Rekursion einzulassen.
Funktionskomplexitäten mit Shell -SkriptingLokale Variablen
Was macht eine variable lokale? Es hängt von diesem bestimmten Block ab, in dem die Variable deklariert wird. Eine Variable als als deklariert als als lokal ist aus diesem Codeblock aus zugänglich sein, in dem es erscheint i.e. Sein Umfang ist lokal. Um dieses Ding zu erklären, schauen wir uns ein Beispiel unten an.
#!/bin/bash func () local i = 10 j = 20 echo "i von func = $ i" echo "j von func = $ j" echo "i externen func = $ i" echo "j Outside Func = $ J "Func Echo" I Outside Func = $ i "echo" j Outside Func = $ j "Exit 0
Bei der Ausführung des obigen Skripts wird die Ausgabe sein.
I Outside Func = J Outside Func = I von Func = 10 J von Func = 20 I Outside Func = J Outside Func = 20
Dies liegt daran, dass die Funktion Func hat noch nicht angerufen, während die Erste 2 Echo -Aussagen wurden ausgeführt. Nach dem Aufrufen der Funktion Func das gleiche 2 Echo -Aussagen ein anderes Ergebnis erzeugen. Jetzt die Variable J, das wurde im Inneren deklariert Func und nicht lokal, könnte danach zugegriffen werden.
Also Wert für J wird 20. Was ist mit der lokalen Variablen? ich? Da sich sein Umfang in der Funktion befand Func, Wert 10 konnte nicht von außen zugegriffen werden. Beachten Sie, dass die Variable J Normalerweise im Inneren deklariert Func ist standardmäßig global.
Jetzt sind Sie mit lokalen Variablen vertraut und wie Sie in Funktionsblöcken verwendet werden. Lassen Sie uns den interessantesten Abschnitt unter Funktionen, die Rekursion, übergehen.
Was ist Rekursion?
Eine Funktion, die sich selbst aufruft, wird im Allgemeinen als Rekursionsverfahren bezeichnet. Oder es kann definiert werden, als ein Algorithmus mit einer einfacheren Version desselben Algorithmus auszudrücken. Betrachten Sie das Beispiel für die Suche nach einer Nummer. Wir wissen das N! = 1 x 2 x 3 x… x (n-1) x n. Somit können wir eine Rezidivbeziehung schreiben wie:
N! = (n-1)! x n
Daher ist es für uns einfach, rekursiv dieselbe Funktion aufzurufen und den Rückgabewert von jedem Aufruf zu verwenden, um mit dem vorherigen Ergebnis zu multiplizieren.e.
5! = 4! x 5 4! = 3! x 4 3! = 2! x 3 2! = 1! x 2 1! = 0! x 1
Rekursion unter Verwendung lokaler Variablen
Hier versuchen wir, ein Skript zu schreiben, um eine Nummer mit lokalen Variablen und Rekursion zu finden.
#!/bin/bash fact () lokale num = $ 1 if [$ num -eq 0]; dann ret = 1 sonst temp = $ ((num-1)) fakt $ temp ret = $ ((num*$?)) fi return $ ret fakte 5 echo "faktorial von 5 = $?"Beenden Sie 0
num ist eine lokale Variable, die zum Speichern verwendet wird N-1 Wert bei jedem Anruf. Hier prüft der Basiszustand, ob die Zahl gleich Null ist oder nicht (da 0! = 1 und faktorial ist nicht für negative Zahlen definiert). Bei der Ankunft dieser Grundbedingung gibt es den Wert zurück 1 zu seinem Anrufer. Jetzt Num = 1 Und ret = 1 x 1.
In diesem Moment kehrt es zurück 1 zu seinem Anrufer. Jetzt Num = 2 Und ret = 2 x 1 usw. Endlich wann Num = 5 Rückgabewert wird sein 24 und das Endergebnis ist ret = 5 x 24. Das Endergebnis 120 wird an die anfängliche Anruferanweisung weitergegeben und angezeigt.
Es gibt ein Problem im obigen Skript. Wie ich im vorherigen Artikel erläutert habe, können Funktionen keine großen Zahlen zurückgeben. Daher ist es den Benutzern überlassen, eine Lösung für das obige Problem zu finden.
Q. Können wir eine Rekursion durchführen, ohne lokale Variablen zu verwenden?? Antwort ist Ja.
Rekursion ohne lokale Variablen
Schauen Sie sich das folgende Beispiel an, um die anzuzeigen Fibonacci -Serie Verwenden von Rekursion. Die grundlegende Rezidivbeziehung lautet:
fib (0) = 0 fib (1) = 1 sonst fib (n) = fib (n-1) + fib (n-2) fibonacci-Serie mit Rekursion #!/bin/bash fib () a = $ 1 if [$ a -lt 2]; dann echo $ a else ((--a)) b = $ (fib $ a) ((--a)) c = $ (fib $ a) echo $ ((b+c)) fi für i in $ (SEQ 0 15) Machen
Im obigen Skript werden keine lokalen Variablen verwendet. Ich hoffe, Sie können den Skriptfluss während der Ausführung verstehen.
Hier der Wert 15 repräsentiert die Anzahl der Begriffe in der Fibonacci -Serie Angezeigt werden. Haben Sie etwas Besonderes hinsichtlich der Ausführung des obigen Skripts bemerkt. Es dauert eine Weile, nicht wahr?? Rekursion in einem Skript ist langsamer als eine Rekursion in Programmiersprachen wie C.
Mit diesem Artikel habe ich vor, die Funktionen am Shell -Skripting abzuschließen. Bleiben Sie auf dem Laufenden mit Tecmint die kommenden Artikel über haben Arrays und vieles mehr…
- « OpenVPN -Server- und Client -Installation und -konfiguration auf Debian 7
- Rainloop Webmail - Ein moderner schneller webbasierter E -Mail -Client für Linux »