Anpassen oder Schreiben einfacher Scripts

Wichtung: 3

Beschreibung: Die Kandidaten sollen in der Lage sein, existierende Scripts anzupassen oder einfache neue BASH-Scripts zu schreiben.

Wichtigste Wissensgebiete:
Standard-Syntax der sh gebrauchen (Schleifen, Tests).
Befehlssubstitution benutzen.
Auswertung der Rückgabewerte (Erfolg, Fehler) oder anderen Informationen eines aufgerufenen Befehls.
Bedingter E-Mail-Versand an den Administrator.
Richtige Wahl des Script-Interpreters durch die Shebang-Zeile (#!).
Verwalten von Speicherort, Besitz- und Ausführungs- und suid-Rechte von Scripten.

Liste wichtiger Dateien, Verzeichnisse und Anwendungen:
for
while
test
chmod

Grundlagen der Shellprogrammierung

Eigentlich kann man alle Anweisungen, sie man manuell in der Shell ausführt, als Skript in einer Datei schreiben. Somit kann man Routine-Aufgaben, die bei der täglichen Administration vorkommen, bequem in einer Skript-Datei niedergeschrieben werden. Die Shell arbeitet dann die Anweisungen nach und nach ab. Einfaches Beispiel:

# Auszug bck.sh
cd /home/peter/bilder
cp * /mnt/backup
tar xvzf /mnt/backup -C /home/peter/backup.tar.gz

In dieser Datei wurden einfach mehrere Befehle nacheinander aufgeschrieben. Somit ist ein Shellscript nichts anderes als eine Textdatei, die einzelne Befehlszeilen enthält, die von der Shell nacheinander abgearbeitet werden. Ausnahmen sind die Zeilen, die mit einer Raute (#) beginnen. Die Raute steht für eine Kommentarzeile.

In dem jeweiligen Skript muss noch festgelegt werden, von welcher Shell es ausgeführt werden soll. Dazu geben wir folgende Information an den Anfang des Skripts:

#!/bin/bash

Jetzt ist bekannt, in welcher Shell das Skript abgearbeitet werden soll. Das ist eine optionale, aber wichtige Angabe, beispielsweise wenn man Bash-Spezifische Anweisungen geschrieben hat.

Shell-Script ausführbar machen

Damit man ein Skript wie ein Programm starten kann, so muss man diese ausführbar machen:

chmod +x bck.sh
./bck.sh

Parameter-Übergabe - Kommandozeilenparameter

Es ist möglich, Shellfunktionen Werte zu übergeben, die dann weiterverarbeitet werden. Folgendes Beispiel: man ruft die Funktion nameAusgabe Peter Mustermann auf. nameAusgabe ist die Funktion, Peter der erste und Mustermann der zweite Parameter. Dann könnte die Funktion wiefolgt aussehen:

nameAusgabe ()
{
Mein Name ist $2, $1
}

Die Ausgabe wäre "Mein Name ist Mustermann, Peter". $1 ist der erste Paramater, $2 der zweite. Es gibt folgende Kommandozeilenparameter:

$0 = Name des Scripts
$1 = 1. Parameter
$2 = 2. Parameter
$3 = 3. Parameter
$4 = 4. Parameter
...
$9 = 5. Parameter

$@ = Alle angegebenen Parameter
$* = Alle angegebenen Parameter
$# = Anzahl aller angegebenen Parameter

if-Anweisung

Die "Wenn-Bedingung" wird in der Programmierung sehr oft genutzt. Das Prinzip ist einfach: "Wenn eine Bedingung war ist, so führe den Inhalt der If-Anweisung aus. Ansonsten ignoriere den Inhalt". Die Syntax lautet:

  if Bedingung 
then
Anweisungen
fi

Die If-Bedingung kann man noch mit "else" erweitern. Man kann sich das so vorstellen: "Wenn die Bedingung wahr ist, dann tue das, ansonsten (else) tue das".

  if Bedingung 
then
Anweisung A
else
Anweisung B
fi

Case - Mehrfache-Auswahl

Oftmals kommt es vor, dass man Variablen auswerten und dann speziell darauf reagieren muss. Es wäre aber sehr unpraktisch, darauf mit einer langen If-Else-Kette drauf zureagieren. Hier bietet sich case an:

case $m in
Jan*|jan*) m=1 ;;
Feb*|feb*) m=2 ;;
Mar*|mar*) m=3 ;;
Apr*|apr*) m=4 ;;
Mai*|mai*) m=5 ;;
Jun*|jun*) m=6 ;;
Jul*|jul*) m=7 ;;
Aug*|aug*) m=8 ;;
Sep*|sep*) m=9 ;;
Okt*|okt*) m=10 ;;
Nov*|nov*) m=11 ;;
Dez*|dez*) m=12 ;;
esac

Dieses Beispiel prüft den Monat und setzt entsprechend die Variable m.

While-Schleife

Die kopfgesteuerte Schleife überprüft vor jedem Schleifendurchgang die Bedingung, die festlegt, ob die Schleife tatsächlich nochmal durchlaufen werden soll. Die Syntax ist:

  while Bedingung
do
Anweisungen
done

Der Inhalt der While-Schleife wird solange durchgeführt, solange die Bedingung wahr, also gleich Null, ist. Beispiel:

while [ $zahl -gt 1 ]; do
fakultaet=$fakultaet*$zahl
zahl=$zahl-1
done

For-Schleife

Eine for-Schleife erhält eine Liste von Werten und führt die Kommandos mit jedem dieser Werte in der Laufvariablen aus.

for  var  in liste
do
kommandos
done

Beispiel: Die Argumente werden einzeln ausgegeben:

for argument in $*        
do
echo $argument
done

Beispiel: Die for-Schleife gibt nur 1 und 3 aus:

for b in 1 2 3 4 5
do
if [ $b -eq 2 ]
then
continue
fi
if [ $b -eq 4 ]
then
break
fi

echo $b
done

test - Bedingungsüberprüfung

Das Programm test wird dazu genutzt, sinnvolle Bedingungen zu überprüfen.

test -f [pfad] = prüft, ob es sich um eine Datei handelt
test -d [pfad] = prüft, ob es sich um ein Verzeichnis handelt
test -e [pfad] = prüft, ob <pfad> existiert
test -r [pfad] = prüft, ob <pfad> existiert und lesbar ist
test -x [pfad] = prüft, ob <pfad> eine ausführbare Datei ist
test -w [pfad] = prüft, ob <pfad> für den Benutzer eine schreibbare Datei ist
test $A -lt $B = prüft, ob $A kleiner $B ist (less then)
test $A -gt $B = prüft, ob $A größer $B ist (greater then)
test $A -le $B = prüft, ob $A kleiner/gleich $B ist (less or equal)
test $A -ge $B = prüft, ob $A größer/gleich $B ist (greater or equal)
test $A -eq $B = prüft, ob $A = $B ist (equal)

shift-Befehl - Verschieben von Parametern

Mit dem Befehl shift kann man den Inhalt der Parameter verschieben. Das bedeutet, dass beispielsweise der Inhalt des Parameters 3 auf den Parameter 2, der Inhalt des Parameters 2 auf den Parameter 1 verschoben wird. Optional kann man angeben, wie oft verschoben werden soll.

// Syntax
shift [n]

// Beispiel:
shift 5

Weitere Quellen

http://www.linux-services.org/shell/
http://www.linuxfibel.de/bashprog.htm