Aus LinuxUser 12/2000

Teil 1: Grundlagen der BASH (Seite 2)

BASH ersetzt die Variablen-Namen übrigens an fast jeder Stelle durch die Werte der Variablen, man spricht hier von der Auflösung der Variablen. Die einzige Ausnahme sind die Hochkomma „‚“ – was dort zwischen steht, wird nicht ersetzt. Um den Namen der Variablen inklusive Dollar-Zeichen zu bekommen, können wir alternativ auch das „$“ escapen:

Wert=100
Wert="$Wert DM"
echo Inhalt der Variablen '$Wert': $Wert
echo Inhalt der Variablen \$Wert: $Wert

In der zweiten Zeile haben wir Wert eine Zeichenfolge zugewiesen, in der die Variable selbst vorkommt. Die BASH wertet dabei zunächst den Teil rechts vom Gleichheitszeichen aus, wobei für $Wert die Ziffern 100 eingesetzt werden – auf der rechten Seite steht dann „100 DM“. Erst danach wird das Ergebnis der rechten Seite (der sogenannte R-Value) der Variablen auf der linken Seite des Gleichheitszeichens (dem sogenannten L-Value) zugewiesen. Diese Behauptung kann man übrigens mit einem kleinen Programmbeispiel beweisen, dazu mehr in der nächsten Folge.

Arithmetische Operationen und Null-Funktion

Mit Zuweisungen allein ist noch nicht viel Staat zu machen, oft braucht man Zähler oder möchte kleine Berechnungen anstellen. Die BASH bietet dazu einige Operatoren, darunter die Grundrechenarten, logische Operatoren und Binäroperationen. Bis auf die logischen Operatoren wie Vergleiche müssen Sie aber sicher stellen, dass Sie wirklich nur mit Zahlen arbeiten. Der Pferdefuß ist, dass BASH in einer Variablen sowohl Text als auch Zahlen speichern kann, und nur Sie dafür verantwortlich sind, dass Sie nicht mit Buchstaben rechnen. Schauen Sie sich noch einmal die ersten zwei Zeilen des letzten Beispiels an. In der ersten Zeile war in Wert noch eine Zahl, in der zweiten Zeile dann haben wir „DM“ angehängt und so aus der Zahl plötzlich eine Zeichenkette (auch String genannt) gemacht. Wir dürfen nun mit Wert nicht mehr rechnen. Tun Sie es trotzdem, bricht BASH Ihr Programm mit Fehlermeldung ab.

Es gibt zwei Schreibweisen für Berechnungen, die Anweisung wird entweder in eckige Klammern oder in doppelte runde Klammern eingeschlossen. Zudem wird ein Dollar vorangestellt. Beide Schreibweisen sind im nächsten Beispiel zu sehen:

Wert=$[$Wert+1]
Wert=$(($Wert+1))
: $[Wert+=1]
: $((Wert+=1))

Insgesamt machen alle vier Zeilen genau das gleiche, sie erhöhen den Inhalt von Wert um eins. Zeile eins und zwei sind noch recht leicht zu durchschauen, hier wird wie üblich zunächst der R-Value ausgewertet und dann dem L-Value zugewiesen. Zeile drei und vier arbeiten vom Prinzip her gleich, denn die Operation „a+=b“ ist definiert als „a=$a+b“ – intern wandelt BASH die Kurzschreibweise. Ungewöhnlich ist hier der Doppelpunkt vor der Rechenanweisung. Er ist eine Null-Funktion, ein Befehl, der nichts tut. Der für uns wichtige Nebeneffekt: Die BASH wertet die Parameter dahinter genauso wie beim Aufruf jeden anderen Befehls aus, berechnet somit das Ergebnis. Notwendig ist der Doppelpunkt, weil die Rechenoperationen stets durch das Ergebnis, nämlich $Wert, ersetzt werden – ohne den Doppelpunkt wäre dies für BASH ein Befehl, der aufgerufen würde.

Neben den Grundrechenarten verfügt die BASH diverse logische und Binäroperatoren, die aber nur selten verwendet werden. Für die meisten Operatoren gibt es zusätzlich Zuweisungs-Operatoren wie in unserem Beispiel +=, die das Lesen von Programmen durchaus einfacher machen können. Eine Übersicht der Operatoren finden Sie in Tabelle 2.

Damit endet die erste Folge, nächstes mal wird es im Programming Corner um die Verarbeitung von Zeichenketten gehen, außerdem werden wir Ihnen Arrays vorstellen und die Verwendung an Beispielen erklären. (mdö)

Tabelle 1: Steuer- und Sonderzeichen der BASH

Zeichen Funktion
Leerzeichen (space) Trenner zwischen Programm-Parametern
Tabulator (tab) Trenner zwischen Programm-Parametern
Return (newline) Befehlseingabe
\ (backslash) Escape-Zeichen
| (pipe) Verkettung der Ein-/Ausgabe mehrerer Programme
& (ampersand) Programm als Hintergrund-Prozess starten, Ein-/Ausgabeumleitung
; (semikolon) Trenner zwischen zwei Programmaufrufen
(, ) (braces) Gruppierung, Berechnung
< (input redirect) Eingabe-Umleitung
> (output redirect) Ausgabe-Umleitung
|| (logical or) Verknüpfung zweier Befehle mit „ODER“
&& (logical and) Verknüpfung zweier Befehle mit „UND“
;; Ende eines case-Falls

Tabelle 2: BASH-Operatoren

Operator/Zuweisungs-Operator Funktion
+, -, *, / +=, -=, *=, /= Grundrechenarten
% %= Rest der ganzzahligen Division (5%2=1)
! Logische Negation (!1 = 0, !0 = 1)
&& Logisch UND (a und b)
|| Logisch ODER (a oder b)
==, != Gleichheit, Ungleichheit
<=, >=, <, > Vergleich größer/kleiner
~ Binäre Invertierung (~1101 = 0010)
& &= Binär UND (1011 & 1101 = 1001)
| |= Binär ODER (1100 | 0101 = 1101)

Versionenkonflikt

Die hier im Artikel gezeigten Beispiele beziehen sich allesamt auf die Version 2 der BASH und sind mit der alten Version 1 nur zum Teil oder auch gar nicht anwendbar. Obwohl die Version 2 nun seit über zwei Jahren in Gebrauch ist und sich bislang keine nennenswerten Probleme gezeigt haben, installieren manche Distributionen-Hersteller wie Red Hat oder Caldera nach wie vor die alte Version 1.4 unter /bin/bash, liefern die Version 2 aber als /bin/bash2 mit.

Deshalb müssen Sie sich gleich als erstes vergewissern, welche Version bei Ihnen über /bin/bash angesprochen wird:

/bin/bash -c 'echo $BASH_VERSION'

Ist /bin/bash die Version 1, müssen Sie sich auf die Suche nach Version 2 machen – sie wird vermutlich in bin liegen und bash2 heißen:

ls /bin/bash2

Meldet ls, er könne /bin/bash2 nicht finden, sollten Sie auf den Installations-CDs Ihrer Distribution nachsehen und das Paket wenn nötig nachinstallieren. In den Programmbeispielen im Artikel müssen Sie dann stets anstelle /bin/bash/bin/bash2 einsetzen, damit die Programme mit der Version 2 arbeiten.

Alternativ können Sie Ihr System auch komplett auf BASH 2 umstellen. Das bedeutet, die Datei /bin/bash muss in /bin/bash1 umkopiert werden und anschließend müssen Sie /bin/bash2 nach /bin/bash kopieren. Eigentlich reicht auch Umbenennen, doch dann würden Programme, die /bin/bash2 verwenden, nicht mehr funktionieren, weshalb /bin/bash2 erhalten bleiben sollte. Das eigentliche Problem ist: Sie können nicht einfach eine Datei überschreiben oder bewegen, die in Benutzung ist – und da Sie als root normal /bin/bash benutzen, müssen wir zunächst mit einem Trick /bin/bash frei machen.

LinuxUser 12/2000 KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS
Deutschland

Hinterlasse einen Kommentar

  E-Mail Benachrichtigung  
Benachrichtige mich zu: