Die For-Syntax nutzt eine Schleifenvariable (I) zusammen mit einem Startwert ($1, also der erste Parameter, den Sie an das Skript übergeben), einer Bedingung zum Fortsetzen der Schleife sowie einem Ausdruck, der angibt, wie sich die Variable nach jedem Schleifendurchlauf ändert.
Die Schleife verarbeitet die Variable I. Am Ende jeder Iteration verringert das Skript den Wert von I um 1 (I++ würde ähnlich I um den Wert 1 erhöhen). Die Schleife läuft durch, solange I größer als 1 ist. Der Rumpf der Schleife multipliziert F (am Anfang auf 1 gesetzt) mit jedem nachfolgenden I. Das Skript endet mit der Ausgabe des Ergebnisses:
$ ./fact 6 6! = 720
Wie man hier sieht, lässt sich auch in der Shell recht zügig Mathematik betreiben. Probieren Sie zum Beweis einmal ./fact 10000.
Menüs erzeugen
Das letzte Skript demonstriert die eingebaute Fähigkeit der Bash zum Generieren von Menüs über den Select-Befehl (Listing 10).
Listing 10
#!/bin/bash
PATH=/bin:/usr/bin
PFILE=/usr/local/sbin/userpkgs # Format der Eingabe: pkgname menu_item
PKGS=( $(cat $PFILE | awk '{print $1}') ) # Array von Paketnamen
MENU="$(cat $PFILE | awk '{print $2}') Fertig" # Liste der Menüpunkte
select WHAT in $MENU; do
if [ $WHAT = "Fertig" ]; then exit; fi
I=$(( $REPLY-1 ))
PICKED=${PKGS[$I]}
echo Installiere Paket $PICKED ... Bitte haben Sie Geduld!... Befehle, um das Paket zu installieren ...
done
Die Parameter für den Select-Befehl setzen Sie in den Variablen PKGS und MENU. Das Konstrukt benötigt eine Liste von Elementen als zweites Argument; dazu dient MENU. Über ein Konstrukt von Befehlssubstitutionen gelangen die Werte in den Platzhalter. Zusätzlich fügt das Skript am Ende der Liste die Zeichenkette Fertig hinzu.
Die Definition von PKGS führt ein neues Feature ein: Arrays. Bei einem Array handelt es sich um eine Datenstruktur mit mehreren Elementen, die Sie über einen Index referenzieren. Folgendes Beispiel definiert und verwendet ein einfaches Array:
$ a=(1 2 3 4 5)
$ echo ${a[2]}
3
Ein Array zu definieren ist sehr einfach: Sie schließen die Elemente in Klammern ein. Um auf ein Element zuzugreifen, verwenden Sie die Syntax aus der zweiten Zeile: Der Name des Elements steht in geschweiften Klammern, der Positionsparameter in eckigen Klammern. Die Zählung der Elemente beginnt bei 0, die Anzahl der Elemente in einem Array erhalten Sie über den Ausdruck ${#a[@]}.
Im Skript kommt ein Array in Form der Variable PKGS zum Einsatz. Darin finden sich die Werte aus dem zweiten Feld jeder Zeile der Eingabedatei. Das Select-Konstrukt verwendet den Inhalt von MENU für die Liste. Select erstellt aus den Elementen ein durchnummeriertes Textmenü und fordert den Benutzer zur Eingabe einer Auswahl auf. Das ausgewählte Element landet in der vor dem Schlüsselwort in angegebenen Variable (hier WHAT), die Nummer des Elements in REPLY.
Das Skript reduziert den Wert von REPLY um 1 für das Abrufen des entsprechenden Paketnamens aus dem Array PKGS, der in der Variable PICKED landet. Die Differenz von 1 kommt zustande, weil die Nummerierung im Menü mit 1, bei den Elementen eines Arrays aber bei 0 anfängt. Wählt der Benutzer das Element Fertig, terminiert das Skript. Listing 11 zeigt ein Beispiel für einen Durchlauf.
Listing 11
1) MP3_Player 3) Photo_Album 2) Spider_Solitaire 4) Fertig #? 2 Installiere Paket spider ... Bitte haben Sie Geduld! [...] #? 4
Fazit
Eine kurze Zusammenfassung von Skript-Befehlen und der Bash-Terminologie finden Sie in der Tabelle “Schnellübersicht”. Sie beendet diesen Ausflug in die Welt des Bash-Skripting und macht hoffentlich Lust auf weitere Entdeckungen zu diesem Thema.
Schnellübersicht
|
Argumente und Variablen |
|
|---|---|
|
|
Befehlsargumente |
|
|
allgemeines Format für Argument |
|
|
alle Befehlsargumente: Liste von separaten Elementen |
|
|
alle Befehlsargumente: ein einzelnes Element |
|
|
Anzahl der Befehlsargumente |
|
|
Skript-Name |
|
|
Wert der Variable |
|
|
allgemeines Format |
|
|
Substring von |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
definiert |
|
|
Element |
|
|
Anzahl der definierten Elemente in |
|
|
Prozessoptionen, Optionsbuchstabe in |
|
Allgemeine Anweisungskonstrukte |
|
|
|
Ausgabe von |
|
|
Ausgabe von |
|
|
Exit-Status des letzten Kommandos |
|
|
PID (Prozess-ID) des zuletzt ausgeführten Hintergrundbefehls |
|
|
Substitutionsoperation am String vornehmen und dann ausführen |
|
|
Datei-Inhalt im Skript einfügen |
|
|
Skript mit dem Status |
|
Testmethoden |
|
|
|
überprüft, ob die Datei die durch den Code |
|
|
Abfrage, ob |
|
|
Länge von |
|
|
Länge von |
|
|
Test auf identische Zeichenfolgen. Andere Operationen: |
|
|
Test, ob Ganzzahlen gleich sind. Andere Operatoren: |
|
|
Logisches NICHT |
|
|
Logisches UND |
|
|
Logisches ODER |
|
|
Gruppieren von Bedingungen. |
|
Eingabe und Ausgabe |
|
|
|
Eingabezeile lesen und aufeinanderfolgende Wörter einzelnen Variablen zuweisen. |
|
|
Eingabeaufforderung für einen einzelnen Wert anzeigen und |
|
|
Inhalte der |
|
Arithmetik |
|
|
|
Ausdruck als Ganzzahl-Operation auffassen. |
|
|
Addition, Subtraktion, Multiplikation, Division |
|
|
Wert um 1 erhöhen/verringern |
|
|
Modulo (Divisionsrest) |
|
|
Potenzieren |
|
Funktionen |
|
|
|
Funktion |

