Home / LinuxUser / 2000 / 12 / Teil 1: Grundlagen der BASH

Newsletter abonnieren

Lies uns auf...

Folge LinuxCommunity auf Twitter

Top-Beiträge

Eingedost
(161 Punkte bei 4 Stimmen)
Aufteiler
(161 Punkte bei 4 Stimmen)

Heftarchiv

LinuxUser Heftarchiv

EasyLinux Heftarchiv

Ubuntu User Heftarchiv

Ubuntu User Heftarchiv

Partner-Links:

Das B2B Portal www.Linx.de informiert über Produkte und Dienstleistungen.

Hallo Welt!

Teil 1: Grundlagen der BASH

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.

Tip a friend    Druckansicht Bookmark and Share
Kommentare

Hits
Wertung: 102 Punkte (13 Stimmen)

Schlecht Gut

Infos zur Publikation

Infos zur Publikation

LinuxUser 05/2014

Aktuelle Ausgabe kaufen:

Heft als PDF kaufen

LinuxUser erscheint monatlich und kostet in der Nomedia-Ausgabe EUR 5,95 und mit DVD EUR 8,50. Weitere Informationen zum Heft finden Sie auf der LinuxUser-Homepage.

Im LinuxUser-Probeabo erhalten Sie drei Ausgaben für 3 Euro. Das Jahresabo (ab EUR 60,60) können Sie im Medialinx-Shop bestellen.

Tipp der Woche

Bilder vergleichen mit diffimg
Bilder vergleichen mit diffimg
Tim Schürmann, 01.04.2014 12:40, 1 Kommentare

Das kleine Werkzeug diffimg kann zwei (scheinbar) identische Bilder miteinander vergleichen und die Unterschiede optisch hervorheben. Damit lassen sich nicht nur Rätsel a la „Orignial und Fäls...

Aktuelle Fragen

programm suche
Hans-Joachim Köpke, 13.04.2014 10:43, 8 Antworten
suche noch programme die zu windows gibt, die auch unter linux laufen bzw sich ähneln sozusagen a...
Funknetz (Web-Stick)
Hans-Joachim Köpke, 04.04.2014 07:31, 2 Antworten
Bei Windows7 brauche ich den Stick nur ins USB-Fach schieben dann erkennt Windows7 Automatisch, a...
Ubuntu 13.10 überschreibt immer Windows 8 Bootmanager
Thomas Weiss, 15.03.2014 19:20, 8 Antworten
Hallo Leute, ich hoffe das ich richtig bin. Ich habe einen Dell Insipron 660 Ich möchte gerne Ub...
USB-PTP-Class Kamera wird nicht erkannt (Windows-only)
Wimpy *, 14.03.2014 13:04, 15 Antworten
ich habe meiner Frau eine Digitalkamera, AGFA Optima 103, gekauft und wir sind sehr zufrieden dam...
Treiber
Michael Kristahn, 12.03.2014 08:28, 5 Antworten
Habe mir ein Scanner gebraucht gekauft von Canon CanoScan LiDE 70 kein Treiber wie bekomme ich de...