UNIX Shellskripte

Erstellen eines Shell-Skripts

Zunächst wird die Datei mit einem Editor geschrieben und per chmod ausführbar gemacht. Alternativ kann sie auch per Punktkommando oder explizites Aufrufen der Subshell ausgeführt werden.

. SkriptDatei
sh SkriptDatei

Das Kommentarzeichen in einer Skriptdatei ist das #. In der ersten Zeile kann in einem Kommentar festgelegt werden, welche Shell bzw. welcher Interpreter für diese Datei geladen werden soll. Das erste Zeichen hinter dem Kommentarzeichen ist ein Ausrufezeichen. Dann folgt mit kompletten Pfad der Interpreter. Beispiel:

#!/bin/sh

Variablen

Die Shellskripten können mit Variablen arbeiten. Diese entsprechen den normalen Environmentvariablen. Zum Auslesen der Variablen wird den Variablen ein Dollarzeichen vorangestellt.

Vererbungslehre

Die Environmentvariablen einer Shell werden normalerweise nicht an Kindprozesse weitergegeben. Wenn in einem Skript eine Variable gesetzt wird, die von einem Kindprozess gelesen werden soll, muß die Variable exportiert werden. Beispiel:

MYENV="Tolles Wetter"
export MYENV

In der Kornshell kann auch setzen und exportieren der Variable zusammengesetzt werden.

export MYENV="Tolles Wetter"

Da dies nicht unter der Standard Bourne-Shell funktioniert und Skripten sehr oft aus Kompatibilitätsgründen mit der /bin/sh gestartet werden, sollte man dies vermeiden.

Wenn ein Skript gebraucht wird, der Environmentvariablen setzen soll, muß dieser mit dem Punktkommando gestartet werden. Beispiel:

. skript

Ansonsten wird eine Kindshell gestartet und dort werden die Variablen gesetzt. Ein eventueller export stellt es dessen Kindern zur Verfügung, aber nicht den Eltern! Endet die Shell, sind ihre Environmentvariablen verloren. Das Punktkommando bewirkt, daß der Skript durch die aktuelle Shell ausgeführt wird und damit die Environmentvariablen auch nach Ende des Skripts erhalten bleiben.

Skriptvariablen

Die Aufrufparameter des Skriptes sind in den folgenden Variablen auslesbar:

$1 $2 .. Parameterstrings
$0 Name der Kommandodatei
$# Anzahl der übergebenen Parameter
$? Ergebnis des Kommandos (korrekter Ablauf)
$$ Prozeßnummer der Shell
$! Prozeßnummer des letzten im Hintergrund abgelaufenen Prozesses
$- aktuelle Shellflags

Struktur-Kommandos

Die for-Schleife

Syntax:

for Variable in Menge
do
  Kommandos
done

In der Schleife wird der Variable die Werte, die durch die Menge hinter dem 'in' definiert wird, der Reihe nach annehmen. Die Variable kann als Argument innerhalb der Schleife durch ein vorangestelltes Dollarzeichen ($) zugegriffen werden.

Die Schleife wird so oft durchlaufen, wie Argumente hinter dem 'in' stehen.

Beispiel:

for i in OSCLUCLT.c OSCLUCLU.c OSCLUSLU.c OSCLUSRV.cbl main.cbl
do
  pr $i | lpr
done

Diese Schleife druckt die aufgeführten Dateien aus.

for a in *.c
do
  echo $a
done

zählt alle C-Sources dieses Verzeichnisses auf.

Bedingungen

Für die meisten Strukturbefehle muß auf eine Bedingung abgefragt werden. Dies geht nicht direkt, sondern wird mittels des Befehls test erreicht. Dabei gilt

test -f Name ist DateiName eine existierende Datei?
test -d Name ist Name ein existierendes Verzeichnis?
test String ist String eine nichtleere Zeichenkette?
test String1 = String2 sind die Zeichenketten String1 und String2 gleich?
test Nummer1 -ge Nummer2 ist die Zahl Nummer1 groesser oder gleich Nummer2?

Die if-Abfrage

if Bedingung
then Befehle
else Befehle
fi

Beispiel für einen rekursiven Skript

cd $1
pwd
ls
for i in *
do
   if test -d $i
   then
      listtree $i
   fi
done

Die Fallunterscheidung: case

Fallunterscheidung

case $i in
     *cc) Kommandos ;;
     *a)  Kommandos ;;
     *) Default Kommandos ;;
esac

Programmeingaben aus dem Skript

Man kann aus der Kommandodatei heraus Programmen Eingaben mitgeben. Dazu wird hinter dem Programmnamen die Zeichenfolge << angegeben. Danach muß ein beliebiges Zeichen folgen, das die Eingabe einleitet. Die nächsten Zeilen werden solange als Eingabe verwendet, bis dieses Zeichen ein zweites Mal auftaucht. Man muß also ein Zeichen verwenden, daß nicht als Eingabe benötigt wird. In unserem Beispiel ist dies ein Ausrufezeichen.

<<!
 Eingabe1
 Eingabe2
!

Benutzereingaben

Man kann auch direkte Benutereingaben abfragen. Das Kommando read liest die Eingabezeile in die angegebene Variable.

 read ANSWER


Homepage (C) Copyright 1999 Arnold Willemer