GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Bash-Anfängerserie Nr. 9:Verwenden von Funktionen in Bash

Wenn Ihre Bash-Skripte immer größer werden, können die Dinge sehr chaotisch werden!

Es kann vorkommen, dass Sie dieselben Codeteile in verschiedenen Teilen Ihrer Bash-Skripte immer wieder neu schreiben.

Glücklicherweise können Sie das Umschreiben von Code vermeiden, indem Sie Funktionen in Bash verwenden, die Ihre Skripte organisierter und lesbarer machen.

In diesem Tutorial lernen Sie, Funktionen zu erstellen, Funktionswerte zurückzugeben und Funktionsargumente in Bash-Shell-Skripten zu übergeben.

Außerdem lernen Sie, wie der Gültigkeitsbereich von Variablen funktioniert und wie Sie rekursive Funktionen definieren.

Erstellen von Funktionen in Bash

Es gibt zwei verschiedene Syntaxen zum Deklarieren von Bash-Funktionen. Die folgende Syntax ist die am häufigsten verwendete Methode zum Erstellen von Bash-Funktionen:

function_name () {
commands
}

Die zweite weniger gebräuchliche Erstellung von Bash-Funktionen beginnt mit der reservierten Arbeitsfunktion, gefolgt vom Funktionsnamen wie folgt:

function function_name {
commands
}

Nun gibt es ein paar Dinge, die Sie bei der Arbeit mit Funktionen beachten sollten:

  • Eine Funktion wird niemals ausgeführt/ausgeführt, es sei denn, Sie rufen die Funktion auf.
  • Die Funktionsdefinition muss jedem Aufruf der Funktion vorangestellt werden.

Jedes Mal, wenn Sie eine Funktion ausführen möchten, müssen Sie sie nur aufrufen! Ein Funktionsaufruf erfolgt einfach durch Bezugnahme auf den Funktionsnamen.

Sehen Sie sich die folgende fun.sh an Bash-Skript:

#!/bin/bash

hello () {
echo "Hello World"
}

hello
hello
hello

Ich habe eine Funktion namens hello definiert das ist einfach die Zeile "Hello World" zum Endgerät. Beachten Sie, dass ich drei Hallo gemacht habe Funktion aufruft, und wenn Sie das Skript ausführen, sehen Sie das „Hello World“ dreimal auf dem Bildschirm gedruckte Zeile:

[email protected]:~$ ./fun.sh
Hello World
Hello World
Hello World

Funktionswerte in bash zurückgeben

In vielen Programmiersprachen geben Funktionen einen Wert zurück, wenn sie aufgerufen werden; Dies ist jedoch bei Bash nicht der Fall, da Bash-Funktionen keine Werte zurückgeben.

Wenn eine Bash-Funktion die Ausführung beendet, gibt sie den Exit-Status des zuletzt ausgeführten Befehls zurück, der in der $? Variable. Null zeigt eine erfolgreiche Ausführung an oder eine positive Ganzzahl ungleich Null (1-255) zeigt einen Fehler an.

Sie können einen Return verwenden -Anweisung, um den Exit-Status der Funktion zu ändern. Sehen Sie sich zum Beispiel die folgende error.sh an Skript:

#! /bin/bash

error () {
blabla
return 0
}

error
echo "The return status of the error function is: $?"

Wenn Sie error.sh ausführen Bash-Skript, werden Sie vielleicht von der Ausgabe überrascht sein:

[email protected]:~$ ./error.sh
./error.sh: line 4: blabla: command not found
The return status of the error function is: 0

Ohne die Rückgabe 0 -Anweisung, der Fehler -Funktion hätte niemals einen Exit-Status ungleich Null als blabla zurückgegeben Dies führt zu einem Befehl nicht gefunden Fehler.

Wie Sie also sehen können, habe ich, obwohl Bash-Funktionen keine Werte zurückgeben, eine Problemumgehung geschaffen, indem ich den Exit-Status von Funktionen geändert habe.

Sie sollten sich auch darüber im Klaren sein, dass eine return-Anweisung eine Funktion sofort beendet.

Argumente an die Bash-Funktion übergeben

Sie können Argumente an eine Funktion übergeben, genau wie Sie Argumente an ein Bash-Skript übergeben können. Sie schließen die Argumente einfach ein, wenn Sie den Funktionsaufruf ausführen.

Zur Veranschaulichung werfen wir einen Blick auf die folgende Datei iseven.sh Bash-Skript:

#!/bin/bash

iseven () {
if [ $(($1 % 2)) -eq 0 ]; then
echo "$1 is even."
else
echo "$1 is odd."
fi
}

iseven 3
iseven 4
iseven 20
iseven 111

Das iseven() Funktion testet, ob eine Zahl gerade oder ungerade ist. Ich habe vier Funktionsaufrufe an iseven() gemacht . Für jeden Funktionsaufruf habe ich eine Zahl angegeben, die die erste Erweiterung der Funktion iseven() ist und auf die durch $1 verwiesen wird Variable in der Funktionsdefinition.

Lassen Sie uns iseven.sh ausführen Bash-Skript, um sicherzustellen, dass es funktioniert:

[email protected]:~$ ./iseven.sh
3 is odd.
4 is even.
20 is even.
111 is odd.

Sie sollten sich auch darüber im Klaren sein, dass Bash-Funktionsargumente und Bash-Skriptargumente zwei verschiedene Dinge sind. Sehen Sie sich zum Vergleich des Unterschieds die folgende funarg.sh an Bash-Skript:

#!/bin/bash

fun () {
echo "$1 is the first argument to fun()"
echo "$2 is the second argument to fun()"
}

echo "$1 is the first argument to the script."
echo "$2 is the second argument to the script."

fun Yes 7

Führen Sie das Skript mit einigen Argumenten aus und beobachten Sie das Ergebnis:

[email protected]:~$ ./funarg.sh Cool Stuff
Cool is the first argument to the script.
Stuff is the second argument to the script.
Yes is the first argument to fun()7 is the second argument to fun()

Wie Sie sehen können, erzeugen Sie unterschiedliche Ergebnisse, wenn Sie innerhalb einer Funktion aufgerufen werden, obwohl Sie dieselben Variablen $1 und $2 verwendet haben, um sowohl auf die Skriptargumente als auch auf die Funktionsargumente zu verweisen.

Lokale und globale Variablen in Bash-Funktionen

Bash-Variablen können entweder einen globalen oder einen lokalen Gültigkeitsbereich haben. Sie können unabhängig vom Gültigkeitsbereich überall in einem Bash-Skript auf eine globale Variable zugreifen. Im Gegensatz dazu kann auf eine lokale Variable nur innerhalb ihrer Funktionsdefinition zugegriffen werden.

Sehen Sie sich zur Demonstration die folgende scope.sh an Bash-Skript:

#!/bin/bash

v1='A'
v2='B'

myfun() {
local v1='C'
v2='D'
echo "Inside myfun(): v1: $v1, v2: $v2"
}

echo "Before calling myfun(): v1: $v1, v2: $v2"
myfun
echo "After calling myfun(): v1: $v1, v2: $v2"

Ich habe zuerst zwei globale Variablen v1 definiert und v2 . Dann in myfun() Definition habe ich die lokale verwendet Schlüsselwort, um eine lokale Variable v1 zu definieren und modifizierte die globale Variable v2. Beachten Sie, dass Sie denselben Variablennamen für lokale Variablen in verschiedenen Funktionen verwenden können.

Lassen Sie uns nun das Skript ausführen:

[email protected]:~$ ./scope.sh
Before calling myfun(): v1: A, v2: B
Inside myfun(): v1: C, v2: D
After calling myfun(): v1: A, v2: D

Aus der Skriptausgabe können Sie Folgendes schließen:

  • Eine lokale Variable, die denselben Namen wie eine globale Variable hat, hat Vorrang vor globalen Variablen innerhalb eines Funktionskörpers.
  • Sie können eine globale Variable innerhalb einer Funktion ändern.

Rekursive Funktionen

Eine rekursive Funktion ist eine Funktion, die sich selbst aufruft! Rekursive Funktionen sind praktisch, wenn Sie versuchen, ein Programmierproblem zu lösen, das in kleinere Teilprobleme zerlegt werden kann.

Die Fakultätsfunktion ist ein klassisches Beispiel für eine rekursive Funktion. Sehen Sie sich die folgende factorial.sh an Bash-Skript:

#!/bin/bash

factorial () {
if [ $1 -le 1 ]; then
echo 1
else
last=$(factorial $(( $1 -1)))
echo $(( $1 * last ))
fi
}

echo -n "4! is: "
factorial 4
echo -n "5! is: "
factorial 5
echo -n "6! is: "
factorial 6

Jede rekursive Funktion muss mit einem Basisfall beginnen was notwendigerweise die Kette rekursiver Funktionsaufrufe beendet. In der Fakultät() Funktion ist der Basisfall wie folgt definiert:

if [ $1 -le 1 ]; then
echo 1

Leiten Sie nun den rekursiven Fall her für die Fakultätsfunktion. Die Fakultät einer Zahl n berechnen wo n eine positive Zahl größer als eins ist, können Sie n multiplizieren durch die Fakultät von n-1 :

factorial(n) = n * factorial(n-1)

Lassen Sie uns die obige Gleichung verwenden, um diesen rekursiven Fall zu schreiben:

last=$(factorial $(( $1 -1)))
echo $(( $1 * last ))

Führen Sie nun das Skript aus und stellen Sie sicher, dass Sie die richtigen Ergebnisse erhalten:

[email protected]:~$ ./factorial.sh
4! is: 24
5! is: 120
6! is: 720

Versuchen Sie als zusätzliche Übung, eine rekursive Funktion zu schreiben, um die n-te Fibonacci-Zahl zu berechnen. Versuchen Sie zuerst, den Basisfall und dann den rekursiven Fall zu finden; du hast das!

Du brauchst mehr Bewegung? Laden Sie das untenstehende PDF herunter und üben Sie Funktionen in Bash-Skripten. Sie haben auch die Lösungen im selben PDF.

Bash-Kapitel-9-ÜbungsfragenProbleme und deren Lösung, um zu üben, was Sie gerade in diesem Kapitel gelernt habenBash-Kapitel-9-Übungsfragen-Linux-Handbuch.pdf31 KB

Fantastisch! Das nächste und letzte Kapitel dieser Serie wird alles, was Sie bisher gelernt haben, anwenden, um effektive Bash-Skripte zu schreiben, die langweilige Verwaltungsaufgaben automatisieren.


Linux
  1. Verwenden von Bash für die Automatisierung

  2. Funktionen in Shell-Variablen?

  3. Bash-Anfängerserie Nr. 8:Schleifen in Bash

  4. Verwenden von Case-Anweisungen in Bash

  5. Verwenden Sie watch, um eine Funktion wiederholt in Bash auszuführen?

Bash-Anfängerserie Nr. 3:Übergabe von Argumenten an Bash-Skripte

Bash-Anfängerserie Nr. 7:Entscheidungsfindung mit If Else- und Case-Anweisungen

Bash-Anfängerserie Nr. 6:Zeichenfolgenoperationen in Bash

Bash-Anfängerserie Nr. 10:Automatisierung mit Bash

Bash-Scripting Teil 6 – Erstellen und Verwenden von Bash-Funktionen

Tutorial zu Bash-Shell-Funktionen mit 6 praktischen Beispielen