Einführung in die Shell-Programmierung

Aufbau

Beispiel:
#!/bin/sh
#
# bsp01.sh
#
# von H. Baeurle - 25.06.02
#
pwd # Das ist jetzt ein Befehl
exit 0
#!/bin/sh
Welches Programm ist für die Abarbeitung des Scriptes verantwortlich?
#
Alle Zeichen nach dem Doppelkreuz # (engl. Hash) werden als Kommentar gewertet und ignoriert.
exit 0
Beendet das Script und gibt den Fehlerwert (engl. Exit-Status) 0 zurück.
Es sind Werte von 0 bis 255 (1 Byte) zulässig.
Alle Werte außer 0 signalisieren einen Fehler. Welchen Fehler Sie welchem Wert zuweisen ist Ihre Sache.
Tip:
echo $? zeigt den Exit-Status des letzten Kommandos an. (Das Kommando false setzt den Exit-Status auf 1, true auf 0.)

Variablen

Beispiel:
#!/bin/sh
#
# bsp02.sh
#
# von H. Baeurle - 25.06.02
#
kind=Michael
stadt=Tettnang
alter=5
echo Der $kind lebt in $stadt und ist $alter Jahre alt.
echo Der $kind lebt in $stadt. Es ist sein $alterter Geburtstag.
exit 0
Ausgabe:
Der Michael lebt in Tettnang und ist 5 Jahre alt.
Der Michael lebt in Tettnang. Es ist sein Geburtstag.
Die Idee mit Es ist sein 5ter Geburtstag funktioniert nicht. Das Script gibt die Variable $alterter aus, deren Inhalt leer ist.
Lösung:
#!/bin/sh
#
# bsp03.sh
#
# von H. Baeurle - 25.06.02
#
kind=Michael
stadt=Tettnang
alter=5
echo Der $kind lebt in $stadt und ist $alter Jahre alt.
echo Der $kind lebt in $stadt. Es ist sein ${alter}ter Geburtstag.
exit 0

Quoting

Quoting verhindert, dass Sonderzeichen die eine besondere Bedeutung haben von der Shell erkannt werden.

Beispiel:
#!/bin/sh
#
# bsp04.sh
#
# von H. Baeurle - 25.06.02
#
zahl=3

# Versuch 1
echo Die Variable "$zahl" hat den Wert $zahl.

# Versuch 2
echo "Die Variable "$zahl" hat den Wert $zahl."

# Versuch 3
echo Die Variable '$zahl' hat den Wert $zahl.

# Versuch 4
echo Die Variable \$zahl hat den Wert $zahl.

exit 0
Ausgabe:
Die Variable 3 hat den Wert 3.
Die Variable 3 hat den Wert 3.
Die Variable $zahl hat den Wert 3.
Die Variable $zahl hat den Wert 3.
Das Echo Kommando bekommt den Text $zahl nicht zu sehen, da die Shell $zahl automatisch durch den Inhalt der Variablen zahl ersetzt.
Dieses Verhalten kann auch durch die Verwendung von " ... " nicht verändert werden.
Erst das strengere ' ... ' verhindert, dass $zahl durch seinen Wert ersetzt wird.
Eine weitere und in vielen Fällen elegantere Möglichkeit ergibt sich aus der Verwendung des sogenannten Fluchtzeichens, das die Sonderbedeutung des folgenden Zeichens aufhebt. Ein \ (engl. Backslash) vor zum Beispiel $zahl hebt die Bedeutung von $ auf. Der \ selbst wird dabei entfernt.
Hieraus ergibt sich die Frage, wie ein \ ausgegeben werden kann. Ganz einfach durch voranstellen eines \. Dieser hebt die Bedeutung des folgenden Zeichens auf. Somit wird mit echo \\ tatsächlich ein \ ausgegeben.
Auch die Funktion des #-Zeichens als Einleitung eines Kommentars kann durch voranstellen des Fluchtzeichens verhindert werden. Ein echo "Das \#-Zeichen wird als Hash bezeichnet" erzeugt die Ausgabe: Das #-Zeichen wird als Hash bezeichnet.
Beispiel:
#!/bin/sh
#
# bsp05.sh
#
# von H. Baeurle - 25.06.02
#
text=Sinn des Lebens
zahl = 42
echo Der $text = $zahl.

exit 0
Ausgabe:
./bsp05.sh: des: command not found
./bsp05.sh: zahl: command not found
Der = .

Der Versuch der Variablen text den Text Sinn des Lebens zuzuweisen schlägt offensichtlich fehl. Die Shell arbeitet das Script Zeile für Zeile ab. Jede Zeile wird in durch Leerzeichen getrennte Wörter aufgeteilt. Somit wird der Text Sinn der Variablen text zugewiesen und anschließend des als neuer Befehl gesucht.
Ebenfalls zu einem Fehler führt die Anweisung zahl = 42. Die beiden Leerzeichen vor und nach dem Gleichheitszeichen müssen verschwinden.

Lösung:
#!/bin/sh
#
# bsp06.sh
#
# von H. Baeurle - 25.06.02
#
text="Sinn des Lebens"
zahl=42
echo Der $text = $zahl.

exit 0
Ausgabe:
Der Sinn des Lebens ist = 42.
Und noch ein Beispiel:
#!/bin/sh
#
# bsp07.sh
#
# von H. Baeurle - 26.06.02
#
datum=`date`
echo "Heute haben wir den $datum"
Ausgabe:
Heute haben wir den Wed Jun 26 07:45:29 MEST 2002

Wird ein Kommando in rückwärtige Anführungszeichen `...` (engl. Backtricks) gesetzt, so wird das Kommando ausgeführt. Die Ausgabe des Kommandos erscheint nicht auf dem Bildschirm sondern ersetzt das Kommando zwischen den beiden ` `.

Das ist das letzte Beispiel zu Qouting:
#!/bin/sh
#
# bsp08.sh
#
# von H. Baeurle - 26.06.02
#
zahl=`cat zahl.txt`
echo "4 * $zahl = `expr 4 \* $zahl`"
Ausgabe:
4 * 5 = 20
Erklärung:
zahl=`cat zahl.txt`
In der Datei zahl.txt steht leldiglich die Zahl 5. Mit dem Kommando cat zahl.txt wird der Inhalt der Datei zahl.txt auf der Standardausgabe ausgegeben. Hier ersetzt diese Ausgabe das Kommando zwischen den beiden ` `. Letzendlich wird somit der Variablen zahl der Inhalt der Datei zahl.txt zugewiesen.
echo "4 * $zahl = `expr 4 \* $zahl`"
Das Kommando expr (engl. Expression) wertet nummerische Ausdrücke aus und gibt das Ergebnis auf dem Bildschirm aus.
expr 3 + 4 führt zu dem Ergebnis 7.
expr 3 \* 4 führt zu dem Ergenis 12.
Der \ vor dem * ist notwendig, damit die Shell den * nicht als Jokerzeichen interpretiert.
Der Ausdruck `expr 4 \* $zahl` wird also durch das Ergebnis der Multiplikation von 4 mit der in der Datei zahl.txt stehenden Zahl ersetzt. Im vorliegenden Beispiel wäre das 4 * 5 = 20.

Verwendung von Parametern

Ähnlich wie bei DOS, können dem Script beim Aufruf mehrere Parameter übergeben werden. Innerhalb des Scriptes kann auf die Parameter über die Variablen $1 bis $9 zugegriffen werden. $0 steht für dien Dateinamen.
Für den Zugriff auf Parameter jenseits der 9 muss die Parameternummer in { } erfolgen. Zum Beispiel ${12} für den Zugriff auf den Parameter $12.
Der Zugriff kann aber auch wie bei DOS durch die Verschiebung der Paramater mit dem Kommando shift erfolgen. Wichtig, da nur die Kornshell und Bash die Angabe in { } erlauben.
Die Variable $# enthält die Anzahl der Paramter.

Beispiel:
#!/bin/sh
#
# bsp09.sh
#
# von H. Baeurle - 25.06.02
#
echo "Die Anzahl der Paramter ist $#"
echo "Parameter \$0 = $0"
echo "Parameter \$1 = $1"
echo "Parameter \$2 = $2"
echo "Parameter \$3 = $3"
echo "Parameter \$4 = $4"
echo "Parameter \$5 = $5"
echo "Parameter \$6 = $6"
echo "Parameter \$7 = $7"
echo "Parameter \$8 = $8"
echo "Parameter \$9 = $9"
echo "Parameter \$10 = ${10}"
echo "Parameter \$11 = ${11}"

echo "Jetzt werden die Parameter um 2 nach links verschoben."
shift 2

echo "Die Anzahl der Paramter ist $#"
echo "Parameter \$0 = $0"
echo "Parameter \$1 = $1"
echo "Parameter \$2 = $2"
echo "Parameter \$3 = $3"
echo "Parameter \$4 = $4"
echo "Parameter \$5 = $5"
echo "Parameter \$6 = $6"
echo "Parameter \$7 = $7"
echo "Parameter \$8 = $8"
echo "Parameter \$9 = $9"
echo "Parameter \$10 = ${10}"
echo "Parameter \$11 = ${11}"

exit 0
Der Aufruf des Scriptes mir folgenden Parametern:
bsp09.sh Heute ist ein echt schoener und sehr sonniger Morgen mit Westwind.
erzeugt die folgende Ausgabe:
Die Anzahl der Paramter ist 11
Parameter $0 = ./bsp09.sh
Parameter $1 = Heute
Parameter $2 = ist
Parameter $3 = ein
Parameter $4 = echt
Parameter $5 = schoener
Parameter $6 = und
Parameter $7 = sehr
Parameter $8 = sonniger
Parameter $9 = Morgen
Parameter $10 = mit
Parameter $11 = Westwind.
Jetzt werden die Parameter um 2 nach links verschoben.
Die Anzahl der Paramter ist 9
Parameter $0 = ./bsp09.sh
Parameter $1 = ein
Parameter $2 = echt
Parameter $3 = schoener
Parameter $4 = und
Parameter $5 = sehr
Parameter $6 = sonniger
Parameter $7 = Morgen
Parameter $8 = mit
Parameter $9 = Westwind.
Parameter $10 =
Parameter $11 =

Letzte Änderung: 26.06.2001 - (c) Dipl.-Gwl., Dipl.-Ing. (FH) H. Bäurle - Elektronikschule Tettnang