Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 5.3

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