Aus Raspberry Pi Geek 05/2014

Erste Schritte mit Bash-Skripten (Seite 6)

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

$1$2?$9

Befehlsargumente

${nn}

allgemeines Format für Argument nn

$@

alle Befehlsargumente: Liste von separaten Elementen

$*

alle Befehlsargumente: ein einzelnes Element

$#

Anzahl der Befehlsargumente

$0

Skript-Name

$var

Wert der Variable var

${var}

allgemeines Format

${var:p:n}

Substring von n Zeichen von var, beginnend bei p

${var-val2}

val2 zurückgeben, falls var nicht definiert ist

${var+val2}

val2 zurückgeben, falls var definiert ist

${var=val2}

val2 zurückgeben, falls var undefiniert ist, und bestimme var=val2

${var?errmsg}

var: errmsg einblenden, falls var undefiniert ist

arr=( var1, var2 )

definiert arr als ein Array

${arr[n]}

Element n von Array arr

${#arr[@]}

Anzahl der definierten Elemente in arr

getopts opts var

Prozessoptionen, Optionsbuchstabe in var zurückgeben (oder ?, wenn ungültig, oder :, wenn das erforderliche Argument fehlt). Der Parameter opts listet erlaubte Buchstaben auf, optional gefolgt von einem Doppelpunkt, der ein Argument verlangt (Doppelpunkt am Anfang: invalide Optionen ignorieren). Gibt das Argument der Option in fest definierter Variable OPTARG zurück.

Allgemeine Anweisungskonstrukte

`cmd`

Ausgabe von cmd erneut auswerten (obsolete Schreibweise)

$(cmd)

Ausgabe von cmd erneut auswerten (kanonische Schreibweise)

$?

Exit-Status des letzten Kommandos

$!

PID (Prozess-ID) des zuletzt ausgeführten Hintergrundbefehls

eval string

Substitutionsoperation am String vornehmen und dann ausführen

. file

Datei-Inhalt im Skript einfügen

exit n

Skript mit dem Status n beenden (0 bedeutet Erfolg)

Testmethoden

-xDatei

überprüft, ob die Datei die durch den Code -x angegebene Bedingung erfüllt. Einige nützliche Operationen sind: -s Datei größer als 0 Byte; -r lesbar; -w schreibbar; -e existiert; -d ist ein Verzeichnis; -f ist eine einfache Datei.

Datei1 -nt Datei2

Abfrage, ob Datei1 neuer ist als Datei2

-z Wort

Länge von Wort gleich 0

-n Wort

Länge von Wort größer als 0

Wort1 = Wort2

Test auf identische Zeichenfolgen. Andere Operationen: !=, >, <.

Zahl1 -eq Zahl2

Test, ob Ganzzahlen gleich sind. Andere Operatoren: -ne, -gt, -lt, -ge, -le.

!

Logisches NICHT

-a

Logisches UND

-o

Logisches ODER

(...)

Gruppieren von Bedingungen.

Eingabe und Ausgabe

read Variable

Eingabezeile lesen und aufeinanderfolgende Wörter einzelnen Variablen zuweisen.

read -p Zeichenkette var

Eingabeaufforderung für einen einzelnen Wert anzeigen und var weitergeben

printf Format-StringVariablen

Inhalte der Variablen dem Format-String entsprechend anzeigen. Der Format-String besteht aus Zeichenketten, Escape-Zeichen (\t für Tabulator, \n für Zeilenumbruch) und Format-Codes: zum Beispiel %s für Zeichenketten, %d für positive oder negative Ganzzahlen, %f für Fließkommazahlen. Ein Bindestrich hinter dem Prozentzeichen bedeutet rechtsbündige Anordnung. Durch eine Ziffer vor dem Kennbuchstaben bestimmen Sie die Feldlänge. Beispiele: %-5d ist eine fünfstellige Ganzzahl, rechtsbündig angeordnet; %6.2f definiert eine Feldlänge von 6 mit zwei Dezimalstellen für eine Fließkommazahl.

Arithmetik

$(( Ausdruck ))

Ausdruck als Ganzzahl-Operation auffassen.

+-*/

Addition, Subtraktion, Multiplikation, Division

++--

Wert um 1 erhöhen/verringern

%

Modulo (Divisionsrest)

**

Potenzieren

Funktionen

name () { Befehle }

Funktion name definieren. Verwenden Sie innerhalb der geschweiften Klammern bei Variablendefinitionen das Schlüsselwort local, um den Geltungsbereich von Variablen auf die Funktion zu begrenzen.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 9 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben