Login
Newsletter
Werbung

Mo, 1. Januar 2001, 00:00

Shell-Workshop, Teil 5

Shell-Workshop, Teil 5.

Logische Verknüpfungen

In Teil 3 dieses Workshops haben wir die if-Kontrollstruktur kennengelernt. In der Bash gibt es zusätzlich aber noch die Operatoren && und ||. Man schreibt diese zwischen zwei Kommandos. Bei && wird das zweite Kommando nur ausgeführt, wenn das erste erfolgreich war (Weiter unten werde ich erläutern, wie sich "Erfolg" genau definiert). Bei || ist es umgekehrt: Nur wenn das erste Kommando erfolglos war, wird das zweite ausgeführt:

cd bilder && ls -l *.png

Hierdurch würden alle PNG-Bilder aufgelistet, wenn in das Verzeichnis "bilder" gewechselt werden konnte. Würde beispielsweise ein solches Verzeichnis nicht existieren, würde das ls-Kommando nicht ausgeführt.

test -e .xsession && test -e .xinitrc || ln -s .xsession
.xinitrc

Hier würde mit "ln -s" ein symbolischer Link von ".xinitrc" auf ".xsession" erstellt, wenn ".xinitrc" nicht existiert, ".xsession" aber schon. Die Datei ".xinitrc" wird übrigens abgearbeitet, wenn X11 per "startx" aufgerufen wird und ".xsession", wenn man einen grafischen Login wie xdm oder kdm verwendet.

Einfacher scripten durch Funktionen

Bild 4: Parameter werden durch spezielle Variablen angesprochen

Wolfgang

Bild 4: Parameter werden durch spezielle Variablen angesprochen

Auch in Shellscripts kommt es vor, dass eine Aufgabe an unterschiedlichen Stellen ausgeführt werden muss. Um nicht den Code an alle betreffenden Stellen kopieren zu müssen und darüber hinaus bei einer Änderung alle Vorkommen davon manuell anpassen zu müssen, verwendet man Funktionen. Durch eine Funktion werden mehrere Anweisungen unter einem Namen zusammengefasst. Einer Funktion können allerdings auch Werte (sog. Parameter) übergeben werden, wie einem Kommando. Genaugenommen sind Funktionen schließlich auch Kommandos. Innerhalb der Funktion können diese Parameter wie folgt verwendet werden: Der erste Parameter kann durch $1 angesprochen werden, der zweite durch $2 usw.

Ein Beispiel dazu sehen Sie auf Bild 4. Hier wird die Funktion "show_info" definiert und anschließend mit dem Parameter "/etc/fstab" aufgerufen, wodurch die beiden Befehle "ls -l" und "file" jeweils auf $1 (in diesem Fall also "/etc/fstab"), angewendet werden. (Warum dieses Beispiel fehleranfällig ist und was daran anders sein sollte, erfahren Sie am Ende dieses Artikels.)

Eingebaute Kommandos - Der feine Unterschied

Wärend die Hauptaufgabe jeder Shell zweifellos immer noch ist, andere Programme aufzurufen, gibt es auch einige Kommandos, die gar nicht als Programme realisiert werden können, sondern in die Shell selbst eingebaut sein müssen.

Dabei handelt es sich um all diejenigen Kommandos, die sich auf die Bash selbst auswirken. Beispielsweise wird mit "cd" das Arbeitsverzeichnis der Shell gewechselt. Bei flüchtigem Hinsehen scheint dies keinen Unterschied zu machen, doch es gibt Situtationen, in denen dieser kleine Unterschied wichtig ist. Wenn Sie beispielsweise die oben besprochene Funktion nicht "show_info" nennen wollen, sondern "file", könnten sie dies so machen:

file ()
{
 ls -l $1
 /usr/bin/file $1
}

Bild 5: Hier wurde das Verhalten von cd erweitert

Wolfgang

Bild 5: Hier wurde das Verhalten von cd erweitert

Damit die Funktion nicht sich selbst aufruft, müsste also der Pfad zu dem Programm angegeben werden, das auch "file" heißt. Da Builtins keine Programme sind, muss hier anders verfahren werden. Auf Bild 5 sehen Sie, wie bei Builtins verfahren wird. Die abgebildete Funktion wechselt in das angegebene Verzeichnis, indem das Schlüsselwort "builtin" vor "cd" geschrieben wird, wodurch das Builtin angesprochen wird und nicht die Funktion. Wenn dieses Kommando erfolgreich war, wird von der Funktion die Datei ".notes" ausgegeben, falls sie existiert. Hier wurde also das Kommando "cd" so erweitert, dass ein Wechsel in ein Verzeichnis direkt dort abgelegte Notizen ausgibt.

Eine vollständige Liste aller Bash-Builtins mit je einer kurzen Beschreibung finden Sie in der "builtins"-Manpage ("man builtins"). Ein weiteres wichtiges Builtin soll hier aber noch besprochen werden: "read". Damit kann eine Zeile eingelesen und in einer beliebigen Variable gespeichert werden. Ein klassisches Beispiel hierzu sehen Sie auf Bild 6. Der Benutzer wird nach seinem Namen gefragt und dieser wird anschließend in einem Satz ausgegeben. Beachten Sie, dass "read" als Argument den Variablennamen erhält, also ohne das Dollarzeichen. Es muss zwischen einer Variablen selbst und ihrem Wert unterschieden werden, wobei man der Bash durch das Dollarzeichen signalisiert, dass sie den Wert der jeweils genannten Variable einsetzen soll.

Bild 6: Man kann Tastatureingaben einlesen und verarbeiten

Wolfgang Jährling

Bild 6: Man kann Tastatureingaben einlesen und verarbeiten

Der Wert einer Variablen wird auch dann eingesetzt, wenn das ganze innerhalb von Anführungszeichen steht. In der Tat sollte man Variablen im Regelfall in Anführungszeichen einbetten ("Quoten"), um unerwünschte Nebeneffekte zu vermeiden. Beispielsweise wird das Ersetzen von Variablen durch ihre Werte von der Bash durchgeführt, bevor die Dateinamens-Expansion, also das Auflösen von "Jokerzeichen" wie * und ?, durchgeführt wird. Die Anführungszeichen verhindern solche zumeist unerwünschten Effekte, wie Sie sie auf Bild 7 sehen können.

Bild 7: Stolpersteine beim Arbeiten mit Variablen

Wolfgang Jährling

Bild 7: Stolpersteine beim Arbeiten mit Variablen

Um derartige Probleme zu vermeiden, sollte man eine der folgenden Varianten verwenden:

echo "Du heißt also $benutzer"
echo Du heißt also "$benutzer"

  • Dieses Werk wurde unter der GNU Free Documentation License veröffentlicht. Das Kopieren, Verbreiten und/oder Modifizieren ist erlaubt unter den Bedingungen der GNU Free Documentation License, Version 1.2 oder einer späteren Version, veröffentlicht von der Free Software Foundation.

    - Weitere Informationen
Kommentare (Insgesamt: 0 )
Pro-Linux
Pro-Linux @Facebook
Neue Nachrichten
Werbung