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.

Dazu loggen Sie sich zunächst als root ein und stellen nochmals sicher, dass es wirklich /bin/bash2 gibt. Ist dem nicht so, dürfen Sie die folgenden Schritte auf gar keinen Fall durchführen, oder Sie riskieren, sich nie wieder als root einloggen zu können! Um im Fehlerfall noch einen Notnagel zu haben, sollten Sie zusätzlich auf eine Text-Konsole wechseln und sich dort als root einloggen. diese Konsole werde ich der Einfachheit halber jetzt als "Notkonsole" bezeichnen. Auf dieser Notkonsole geben Sie zunächst nichts weiter ein, sondern wechseln wieder auf Ihre Arbeitskonsole. Dort ändern Sie die Voreinstellung der Shell für den Benuzter root:

chsh -s /bin/bash2 root

Loggen Sie sich jetzt nicht aus, sondern schalten Sie auf eine freie Textkonsole und loggen Sie sich dort wieder als root ein. Hat alles geklappt, liefert Ihnen echo $BASH_VERSION auf dieser Konsole die Version 2. Können Sie sich nicht einloggen, ist irgend etwas schief gegangen und Sie müssen unbedingt den alten Zustand wieder herstellen. Dazu wechseln Sie auf die Notkonsole und ändern mit chsh -s /bin/bash root die Login-Shell wieder auf den Anfangswert.

Hat das Login geklappt, haben Sie nun eine neue Notkonsole, und loggen sich aus der alten und aus allen anderen Konsolen aus. Es kann auch notwendig werden, KDE oder GNOME zu schließen. Als einziges bleibt nun die neue Notkonsole übrig. Nun folgt die Umstellung von BASH 1 auf BASH 2.

Dazu loggen Sie sich auf einer neuen Konsole wiederum als root ein und kopieren nun bash zu bash1 und anschließend bash2 zu bash:

cp /bin/bash /bin/bash1
cp /bin/bash2 /bin/bash

Als letzte Aktion setzen Sie die Login-Shell von root wieder zurück:

chsh -l /bin/bash root

Können Sie sich auf einer weiteren Konsole wieder als root einloggen und bekommen Version 2 der BASH angezeigt, hat der Umbau geklappt. Nun ist die Version 2 Ihre Standard-Shell und Sie können wieder ganz normal weiterarbeiten.

Befehle

echo Gibt alle Parameter durch je ein Leerzeichen voneinander getrennt aus.
(Doppelpunkt) Null-Funktion, hat keine direkte Wirkung. Wird teilweise für arithmetische Operationen oder Variablen-Manipulationen benutzt. Die eigentlichen Operationen werden als Parameter der ":"-Funktion angegeben.
$[..] Berechnet den in der Klammer stehenden arithmetischen Ausdruck und liefert das Ergebnis.
$((..)) Berechnet den in der Klammer stehenden arithmetischen Ausdruck und liefert das Ergebnis.

Glossar

Meta-Character

Sonderzeichen, wird in besonderer Weise interpretiert.

Control-Character

Veranlasst eine Aktion oder Sonderbehandlung der Befehlszeile.

Escape-Zeichen

Hebt die Wirkung von Meta-, Control- und Escape-Charactern auf.

Quotes

Anführungszeichen, Hochkommas und umgedrehte Hochkommas. Sie sorgen dafür, dass ein Großteil der Meta- und Control-Character nicht mehr als solche interpretiert werden. Sie müssen stets paarweise verwendet werden.

R-Value

Das Ergebnis der Anweisung rechts vom Gleichheitszeichen

L-Value

Die Variable links des Gleichheitszeichens, in der der R-Value gespeichert wird

Script

engl. "Protokoll", man bezeichnet damit allgemein Shell- und manchmal auch Perl-Programme. Das Script ist stets eine Text-Datei, die man sich direkt anzeigen lassen kann.

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 

Ähnliche Artikel

  • Einführung in die Bash-Programmierung
    Skripte sollen meist wiederkehrende oder lästige Arbeiten automatisieren. Die Standard-Shell Bash stellt Ihnen dazu eine ganze Reige von Funktionen bereit. Dieser Artikel erklärt, wie Sie ihre eigenen Shell-Skripte schreiben.
  • Teil 2: Grundlagen der Bash
    Nachdem wir uns in der letzten Ausgabe die Metazeichen sowie die grundlegende Verwendung von Variablen angesehen haben, stoßen wir heute in das Reich der mehrdimensionalen Variablen vor und beschäftigen uns am Ende noch mit der Verarbeitung von Zeichenketten.
  • Teil 5: Kontrollstrukturen die Zweite
    Nach der Einführung in die Kontrollstrukturen und Vorstellung von einfachen Vergleichsmöglichkeiten im letzten Teil beschäftigen wir uns diesmal mit Reihenvergleichen, Schleifen, Tastatureingaben und kleinen Auswahlmenüs.
  • Teil 3: String-Verarbeitung und Reguläre Ausdrücke
    Die Grundlagen der Zeichenketten haben wir in der letzten Ausgabe gelegt. Diesmal wollen wir uns aber nicht mit einfachen Leer-Tests oder Längenanzeigen begnügen, sondern unsere Strings kräftig durcheinander wirbeln.
  • Teil 6: Funktionen und Module
    Programmiersprachen sind dazu gedacht, Computer-Befehle in menschlich lesbarer Form aufzuschreiben. Dazu gehört mehr als nur verständliche Befehle – eine übersichtliche Strukturierung und Untergliederung tut Not.
Kommentare

Infos zur Publikation

LU 12/2014: ANONYM & SICHER

Digitale Ausgabe: Preis € 4,95
(inkl. 19% MwSt.)

Mit der Zeitschrift LinuxUser sind Sie als Power-User, Shell-Guru oder Administrator im kleinen Unternehmen monatlich auf dem aktuelle Stand in Sachen Linux und Open Source.

Sie sind sich nicht sicher, ob die Themen Ihnen liegen? Im Probeabo erhalten Sie drei Ausgaben zum reduzierten Preis. Einzelhefte, Abonnements sowie digitale Ausgaben erwerben Sie ganz einfach in unserem Online-Shop.

NEU: DIGITALE AUSGABEN FÜR TABLET & SMARTPHONE

HINWEIS ZU PAYPAL: Die Zahlung ist auch ohne eigenes Paypal-Konto ganz einfach per Kreditkarte oder Lastschrift möglich!       

Tipp der Woche

Ubuntu 14.10 und VirtualBox
Ubuntu 14.10 und VirtualBox
Tim Schürmann, 08.11.2014 18:45, 0 Kommentare

Wer Ubuntu 14.10 in einer virtuellen Maschine unter VirtualBox startet, der landet unter Umständen in einem Fenster mit Grafikmüll. Zu einem korrekt ...

Aktuelle Fragen

Nach Ubdates alles weg ...
Maria Hänel, 15.11.2014 17:23, 4 Antworten
Ich brauche dringen eure Hilfe . Ich habe am wochenende ein paar Ubdates durch mein Notebook von...
Brother Drucker MFC-7420
helmut berger, 11.11.2014 12:40, 1 Antworten
Hallo, ich habe einen Drucker, brother MFC-7420. Bin erst seit einigen Tagen ubuntu 14.04-Nutzer...
Treiber für Drucker brother MFC-7420
helmut berger, 10.11.2014 16:05, 2 Antworten
Hallo, ich habe einen Drucker, brother MFC-7420. Bin erst seit einigen Tagen ubuntu12.14-Nutzer u...
Can't find X includes.
Roland Welcker, 05.11.2014 14:39, 1 Antworten
Diese Meldung erhalte ich beim Versuch, kdar zu installieren. OpenSuse 12.3. Gruß an alle Linuxf...
DVDs über einen geeigneten DLNA-Server schauen
GoaSkin , 03.11.2014 17:19, 0 Antworten
Mein DVD-Player wird fast nie genutzt. Darum möchte ich ihn eigentlich gerne abbauen. Dennoch wür...