1 Shellscripts - Einfache Batchabläufe erstellen.
Ein Shellscript ist vergleichbar mit den unter MS-DOS bekannten "Batchdateien", mit den eine Reihe von Befehlen zusammengefaßt werden kann. Unter UNIX wird eine solche Reihe von Befehlen in einer einfachen Textdatei gespeichert. Diese muß das Ausführungsrecht besitzen, damit Sie gestartet werden kann.
Um das Verzeichnis zu ermitteln, in dem die Datei gespeichert ist, wird der Befehl "type" verwendet. Dieser gibt auch an, ob es sich um einen internen Befehl der Shell oder um ein externes Shellscript handelt.
Beispiel:
Code Block |
---|
linux:~ # type mkdir mkdir is /bin/mkdir linux:~ # |
Die ausführbare Datei wird über die Reihenfolge der Verzeichnisse gesucht, die in der Umgebungsvariable PATH gespeichert sind.
(Nicht zuerst im aktuellen Verzeichnis !)
Um die Abläufe der Shellscripts im Fehlerfall zu testen, kann mit der Anweisung "set -x" bewirkt werden, daß alle Befehle als Echo auf dem Bildschirm noch einmal angezeigt werden, bevor sie ausgeführt werden.
Um Bildschirmausgaben besser lesen zu können, kann der Befehl
Code Block |
---|
sleep <Wert> |
zur Verzögerung verwendet werden.
1.1 Zuweisung von Werten zu Variablen
Die einfache Syntax "VARIABLE=WERT" führt zur lokalen Zuweisung, d.h. die Variablen haben nur innerhalb des Shellscripts Gültigkeit. Mit dem Befehl "export VARIABLE" kann die Variable auch von Befehlen und Programmen genutzt werden, die in diesem Shellscript aufgerufen werden. Mit "unset VARIABLE" löscht den Inhalt der Variable wieder. Der Wert einer Variablen kann mit echo $VARIABLE ausgegeben werden. Das Kommando "set" gibt eine Liste aller gesetzten Variablen mit ihren Werten aus.
Um eine Benutzereingabe einer Variablen zuzuordnen, kann der Befehl "read VARIABLE" eingesetzt werden. Die Benutzereingabe muß mit RETURN abgeschlossen werden.
1.2 Parameterübergabe
Die an ein Shellscript übergebenen Parameter sind in folgenden Systemvariablen enthalten.
$0 | Der Name des Shellscripts selbst. |
$1 | Erster Parameter |
$2 | Zweiter Parameter usw. |
$# | Anzahl der Parameter |
$* | Alle Parameter zusammen |
Mit dem Befehl "shift" werden alle Parameter "aufgerückt", d.h. $1 entfällt, $2 wird zu $1 kopiert, $3 zu $2 usw. |
1.3 Returnwerte abfragen / setzen
Der Returncode der letzten Anweisung ist in der Variablen "$?" gespeichert. Hierbei wird der Wert 0 in der Regel mit einem positiven Ergebnis verknüpft.
Der Returncode des aktuellen Shellscripts wird als Parameter zum Befehl exit übergeben. Beispiel:
exit -1 #Beendet das aktuelle Shellscript mit dem Wert -1
1.4 Einfache Bedingungsprüfung
Die einfache Entscheidung zwischen zwei Bearbeitungsfällen wird durch den if-Anweisungsblock realisiert.
Die allgemeine Form:
Code Block |
---|
if <Bedingung> then Anweisung1 #für den Fall, daß die Bedingung zutrifft [else] Anweisung2 #für den Fall, daß die Bedingung nicht zutrifft. fi |
Hinweise:
Sind mehrere Fälle zu unterscheiden kann statt "else" auch "elif" gefolgt von "then" für einen neuen Anweisungsteil verwendet werden:
Code Block |
---|
if <Bedingung1> then Befehl1 elif <Bedingung2> then Befehl2 else Befehl3 fi |
Als <Bedingung> sind Ergebnisse des Befehls "test" zu verwenden, der in mehreren verschiedenen Syntaxvarianten einzusetzen ist. Im Manual des Befehls "test" ist eine vollständige Dokumentation aller Optionen vorhanden. Hier eine beschränkte Auswahl
Option | Wirkung |
Wert1 -eq Wert2 | Ist wahr, wenn Wert1 = Wert2, nur für numerische Werte. Für nicht numerische werte kann auch Wert1 == Wert2 verwendet werden. |
Wert1 -ge Wert2 | Wert1 ist größer oder gleich Wert2 |
Wert1 -le Wert2 | Wert1 ist kleiner oder gleich Wert2 |
! | Der NOT-Operator kehrt das Testergebnis um. |
-f <Datei> | Ist wahr, wenn die angegebene Datei eine reguläre Datei ist. |
-z "Wert1" | Ist wahr, wenn die Variable leer ist (für Zeichenketten). |
Mögliche Syntaxarten sind beispielsweise:
Code Block |
---|
test -f <Datei> |
oder
Code Block |
---|
[ -f <Datei> ] |
Die logische Grundverknüpfung OR entspricht "||" und AND "&&"
Beispiel:
Code Block |
---|
if [ $# -eq 0 ] || [ $# -eq 1 ] then #wenn die Anzahl der Parameter 0 oder 1 ist. else #wenn die Bedingung nicht zutrifft. fi |
Auch möglich ist die Syntax:
Code Block |
---|
if [ $# -eq 0 -o $# -eq 1 ] then #wenn die Anzahl der Parameter 0 oder 1 ist. else #wenn die Bedingung nicht zutrifft fi |
Die Option -o bewirkt die OR-Verknüfung, -a steht für die AND-Verknüpfung.
1.5 Mehrfache Bedingungen
Sind für eine Bedingung mehrere mögliche Fälle zu unterscheiden ist die Abfrage mit "if-Anweisungsblöcken" unübersichtlich. In diesem Fall wird die case-Anweisung verwendet. Allgemeine Syntax:
Code Block |
---|
case <Variable> in Fall1) Anweisung1 ;; Fall2) Anweisung2 ;; *) # die Fälle 1 und 2 treffen nicht zu ;; esac |
Hinweise:
Durch die ";;" wird das Ende eines Anweisungsteils gesetzt.
Durch esac wird das Ende der Case-Anweisung angezeigt. Beispiel:
Code Block |
---|
echo "Wollen Sie die Bearbeitung wirklich durchführen ? (J/N)" read EINGABE case $EINGABE in J) echo "Die Verarbeitung wird durchgeführt" ;; N) echo "Die Verarbeitung wird nicht durchgeführt" ;; *) echo "Falsche Eingabe $EINGABE . Programmabbruch" exit -1 ;; esac |
1.6 Schleifen
Durch eine while-Schleife kann eine Folge von Anweisungen solange ausgeführt werden, bis eine bestimmte Bedingung erreicht wird.
Allgemeine Syntax:
Code Block |
---|
while <Bedingung> do Anweisung done |
Beispiel:
Code Block |
---|
echo "Wollen Sie die Bearbeitung wirklich durchführen ? (J/N)" read EINGABE while [ ! "$EINGABE" == "J" -a ! "$EINGABE" == "N" ] do echo "Falsche Eingabe, Geben Sie J oder N ein" read EINGABE done |
Durch eine for-Schleife kann eine Folge von Anweisungen mehrfach mit verschiedenen Daten ausgeführt werden.
Allgemeine Syntax:
Code Block |
---|
for <Variable > in <Werteliste> do Anweisung done |
Beispiel:
Code Block |
---|
for i in "datei1" "datei2" "datei3" do if [ ! -f $i ] then echo ACHTUNG, die Datei $i existiert nicht" fi done |