Home / LinuxUser / 2001 / 07 / Teil 6: Funktionen und Module

Newsletter abonnieren

Lies uns auf...

Folge LinuxCommunity auf Twitter

Top-Beiträge

Mandriva gibt Distribution in die Hände der Community
(268 Punkte bei 24 Stimmen)
Neues vom Systemd
(161 Punkte bei 4 Stimmen)
Mandriva in Nöten
(161 Punkte bei 4 Stimmen)

Heftarchiv

LinuxUser Heftarchiv

EasyLinux Heftarchiv

Ubuntu User Heftarchiv

Ubuntu User Heftarchiv

Partner-Links:

Shopping
Topsuche
 
Yatego Deutschlands größte Shoppingmall. 10000 Shops,
3.5 Mio Artikel. Alle Bestseller, Servertechnik und Technik Themenwelten.

Notebooks und Netzwerkhardware bei Mercateo günstig kaufen.
Internet Telefonie mit VoIP Telefonen von Gigaset
Das B2B Portal www.Linx.de informiert über Produkte und Dienstleistungen.
Günstige Digitalkameras finden Sie im Preisvergleich.

Baukastensystem

Teil 6: Funktionen und Module

Lokale Variablen

Wir benötigen Variablen, die lediglich für unsere Funktion gelten und auf keinen Fall mit globalen Variablen kollidieren: Lokale Variablen. Sie werden durch Voranstellen des Schlüsselworts local bei der ersten Benutzung oder am Anfang der Funktion definiert und gelten nur für diese eine Funktion. Das folgende Listing zeigt die veränderte Funktion Trennzeile aus unserem Beispiel:

002  Trennzeile ()
 003  {
 004    local i=0
 005    while [ $i -lt 10 ]; do
 006      echo -n "*"
 007      i=$[$i+1]
 008    done
 009    echo
 010  }

Wir verwenden $i nach wie vor im Hauptprogramm (Zeile 13 und 16) und in der Funktion (Zeile 5 und 7), offensichtlich muss es hier eine Kollision geben. Das Problem wird durch Überdeckung bereits benutzter Namen gelöst: Die Variable $i innerhalb von Trennzeile ist unabhängig von ihrer globalen Namensvetterin, wir haben also zwei verschiedene $i. Der Nachteil ist, dass wir jetzt in Trennzeile nicht mehr an die globale Variable $i herankommen. Manchmal benötigt man eine globale Variable als Anfangswert, ohne sie im weiteren Verlauf der Funktion zu verändern zu dürfen, man müßte in der Funktion mit einer neuen Variablen arbeiten. Dafür gibt es einen Trick – wir weisen die globale Variable $i beim Anlegen der lokalen Variable $i als Anfangswert zu. Dabei nutzen wir aus, dass die Bash zunächst den Teil rechts des Gleichheitszeichens auswertet und das Ergebnis der linken Seite zuweist.

002  Trennzeile ()
 003  {
 004    local i=$i
 005    while [ $i -lt 10 ]; do
 006      echo -n "*"
 007      i=$[$i+1]
 008    done
 009    echo
 010  }

Im Ergebnis verkürzt sich damit unsere Trennzeile um jeweils ein Sternchen:

    *
 1
     
 2
    *
 3

Rückgabewerte

Eine Funktion hat genau wie ein Programm einen Rückgabewert (Exit-Code), der über die Spezial-Variable $? unmittelbar nach Ende der Funktion abgefragt werden kann. Standardmäßig ist der Rückgabewert einer Funktion identisch mit dem Rückgabewert des zuletzt ausgeführten Befehls. Bei Trennzeile war der letzte Befehl echound somit der Rückgabewert stets 0. Mittels return können Sie andere Werte zurückgeben. Hier eine Funktion, die stets "falsch", also einen Wert ungleich null, liefert:

Falsch ()
 {
   return 1
 }

return verlässt die Funktion auf der Stelle und ist besonders dann interessant, wenn in einer Funktion Fehler auftreten können. DateiLesen wird, falls die als Parameter $1 übergebene nicht existiert oder nicht lesbar ist, beendet und liefert als Rückgabewert eins. Andernfalls wird der Inhalt in $Inhalt gespeichert und der Rückgabewert dieser Aktion (dieser ist immer null, eine Zuweisung ist stets erfolgreich) verwendet.

DateiLesen ()
 {
   if [ ! -r $1 ]; then
     return 1
   fi
   Datei="`cat $1`"
 }

Durch die Aufgliederung eines Programmes in Funktionen kann es vorkommen, dass erst in einer Funktion ein Fehler festgestellt wird, der die weitere Programmausführung unmöglich macht, wie etwa zu wenig freie Festplattenkapazität. Diesen Fehler kann man an den Aufrufer zurückmelden, einfacher ist es aber das Programm sofort abzubrechen. Dazu dient der Befehl exit, der genau wie return einen Rückgabewert erhalten kann:

DateiLesen ()
 {
   if [ ! -r $1 ]; then
     exit 1
   fi
   Datei="`cat $1`"
 }
Einem Freund empfehlen    Druckansicht Bookmark and Share
Kommentare

Hits
Wertung: 0 Punkte (0 Stimmen)

Schlecht Gut

Infos zum Autor

Mirko Dölle

Redakteur für Linux bei c't, Heise Zeitschriften Verlag; ehemals Competence Center Hardware/Linux-Magazin, Linux New Media AG


Infos zur Publikation

Infos zur Publikation

LinuxUser 06/2012

Aktuelle Ausgabe kaufen:

Heft bestellen Heft als PDF kaufen

LinuxUser erscheint monatlich und kostet in der Nomedia-Ausgabe EUR 5,50 und mit DVD EUR 8,50. Weitere Informationen zum Heft finden Sie auf der LinuxUser-Homepage.

Im LinuxUser-Probeabo erhalten Sie drei Ausgaben für 3 Euro. Das Jahresabo (ab EUR 56,10) können Sie im LNM-Shop bestellen.

Tipp der Woche

Adobe AIR
Adobe-AIR-Programme installieren und (manuell) starten
Tim Schürmann, 14.05.2012 13:09, 0 Kommentare

Es gibt sie noch: neue Anwendungen, die Adobes Integrated Runtime voraussetzen. Aktuellstes und vermutlich auch größtes Beispiel ist das Adventure Botanicula

Aktuelle Fragen

gibt es ein Kommandozeilen Tool, um ein X11-Fenster in ein Anderes einzubetten?
GoaSkin , 21.05.2012 16:44, 0 Antworten
Das XEmbed-Protokoll ist u.A. dazu gedacht, dass man eine X11-Anwendung in eine andere wie ein Wi...
Apache2, Options -Indexes geht nicht
no no, 12.05.2012 19:01, 8 Antworten
Habe in apache2.conf folgendes stehen: Options -Indexes ...
LInux auf Dell LS H500
Andreas Endresl, 09.05.2012 08:54, 2 Antworten
Habe einen alten Dell Latitude LS H500 nur mit ext. Floppy und CD es geht nur immer eines von den...
Datenwiederherstellung unter Ubuntu 12.04 mit "Simple Backup" nach Umzug von Linux Mint
Christian Lottmann, 07.05.2012 13:33, 0 Antworten
Vor dem Umzug auf Ubuntu 12.04 habe ich unter Linux MInt mit "Simple Backup" voll (15.4.2012) und...
DKMS für den propritären NVIDIA-Treiber
Commander Data, 26.04.2012 22:02, 2 Antworten
Hallo an die Gemeinde. Ich habe hier ein interessantes Stück openSuSE gefunden. http://forums.op...