Bash Benutzerhandbuch 3.2 Start
Aus Fedorawiki.de
Projektstatus: 26 %
;
Letzte Bearbeitung: Mi., 21.01.09;
Letztes Unterkapitel: Variablenfelder - Vektoren
Projektdetails
Bash ist Fedoras Shell und dies ist das offizelle deutsche Benutzerhandbuch.
Über dieses Benutzerhandbuch
Vorwort vom Übersetzer
Das nachfolgende Werk ist ein Benutzerhandbuch zur Shell BASH. Es unternimmt den Versuch, die Funktionen und deren Verwendung auf Benutzerebene zu erklären. Es soll auch ein Anhalt für die komplexe Verwendung der BASH sein, sowie eine Grundlage für erweitere von Skripten (Programmierung) bilden. Das hier erlernte Sachwissen, wird das Lesen tiefer gehender Literatur zur BASH vereinfachen und das Verstehen unterstützen. Darüber hinaus soll es als einfaches Nachschlagewerk dienen, um Wissen zu erlangen und zu festigen.
Methodik und Didaktik im englischen Original, lassen durchaus Wünsche entstehen. Ich bin gewillt, dies im diesem Werk deutlich zu verbessern.
Es ist weder eine Einführung in die Nachrichten- oder Informationstechnik, noch ist es als erklärendes Werk zur Programmiertechnik gedacht und schon gar nicht fachumfassend.
Vom Leser werden Betriebssystemgrundlagen, insbesondere über Linux vorausgesetzt.
Begleitend zu diesem Handbuch, bieten sich viele andere Lernquellen an. Im Artikel BASH werden Sie viele Hinweise erhalten. Nach und nach werden sich in diesem Wiki, mehr und mehr Fach- und Sachinformationen oder Verweise auf Solche finden lassen, die diese Grundlagen darstellen und ergänzen. Es folgt ein kurzer Blick auf den Inhalt dieses Benutzerhandbuches:
Überblick
Dies ist die Ausgabe 3.2, im Original zuletzt am 28.09.2006 aktualisiert , des GNU BASH Referenz Benutzerhandbuches.
BASH enthält Leistungsmerkmale wie andere bekannte Shell's auch, darüber hinaus solche, die nur in BASH zu finden sind. Einige der Shell's aus denen Bash Konzepte entlehnt hat, sind die Bourne Shell (sh), die Korn Shell (ksh), die C-Shell (csh) und ihrer Nachfolgererin der TENEX-C-Shell (tcsh).
Folgende Themen werden im Benutzerhandbuch genauer erläutert.
- Einführung: Einführung in Shells, insbesondere BASH
- Konventionen: Konventionen die im weiteren Verlauf des Benutzerhandbuches verwendet werden.
- Grundlegende Leistungsmerkmale: Pfeiler auf die sich die BASH stützt.
- BASH interne Kommandos: Kommandos welche ein Teil von BASH sind.
- BASH Variablen: Auslesbare oder manipulierbare Variablen der BASH.
- BASH Leistungsmerkmale: Exklusive Leistungsmerkmale der BASH.
- Auftragssteuerung: Was Auftragssteuerung ist und wie BASH sie ermöglicht.
- Interaktive Verlaufskontrolle: Die Kommandoverlauf Erweiterung.
- Kommandozeilenmanipulation: Dieses Kapitel beschreibt die Manipulation vom Kommandozeilen.
- BASH Einrichtung: Erstellung von BASH aus dem Quelltextarchiv, erstmalige Einrichtung auf dem Zielsystem.
- Fehlerberichte: Wie über Fehler in der BASH berichtet werden kann.
- Grobe Unterschiede zur Bourne Shell (bsh): Eine kurze Beschreibung zu Unterschieden zwischen BASH und BSH, sowie die Versionsgeschichte von /bin/sh.
- Kopieren dieses Handbuches: Informationen zur Vervielfältigung und Weitergabe dieses Benutzerhandbuches.
- Interner Kommando Index: Alphabetische Auflistung aller enthaltenen Kommandos.
- Index reservierter Ausdrücke: Alphabetische Auflistung reservierter Ausrücke der BASH.
- Varibalen und Parameter Index: Alphabetische Auflistung aller Variablen und Paramter der BASH.
- Funktionen Index: Alphabetische Auflistung aller Readline (Lesezeile) Funktionen.
- Anhang: Listen und Übersichten aller Art.
- Interner Kommando Index: Alphabetische Auflistung aller enthaltenen Kommandos.
- Index reservierter Ausdrücke: Alphabetische Auflistung reservierter Ausrücke der BASH.
- Varibalen und Parameter Index: Alphabetische Auflistung aller Variablen und Paramter der BASH.
- Funktionen Index: Alphabetische Auflistung aller Readline (Lesezeile) Funktionen.
- Stichwort Index: Alphabetische Auflistung aller, im Benutzerhandbuch vorhandener, Stichworte.
Begriffsbestimmungen
Einführung
Der erste Autor der BASH ist Brian Fox, ein Angestellter der Free Software Foundation. Zur Zeit betreut und entwickelt Chet Ramey als Angestellter der Case Western Reserve University die BASH ehrenamtlich.
Was ist eine Shell?
Funktionelles Prinzip
Die Shell ist integraler Bestandteil eines Betriebssystemes. Sie führt Programme aus, dient als Programmiersprache und bietet Möglichkeiten die Benutzerumgebung anzupassen. So etwas wie die Gangschaltung im Getriebe, zwischen den Rädern und dem Steuerrad. Sie bietet Zugang zu Funktionen des Betriebssystem-Kerns und anderen (nicht offensichtlichen) Teilen des Betriebssystems. Sie nutzt diese teils automatisch. Sie liest auch Nachrichten vom Betriebssystem-Kern, die an den Benutzer oder andere Programme adressiert sind und verarbeitet sie entsprechend.
Programmiertechnisch gesehen ist eine Shell ein Makro-Prozessor der Kommandos verarbeitet. Mit dem Begriff Makro-Prozessor, ist funktionell, das Anreichern von Zeichen (Ziffern, Buchstaben und Symbolen) zu größeren Ausdrücken gemeint.
Ableitung des Namens
Shell lässt sich mit Schale, Gehäuse, Mantel, Hülle, oder Muschel übersetzen. Die Shell umgibt logisch den Kern und fügt Bootloader, Kern und andere Programme zum Betriebssystem zu einem benutzbaren Gebilde zusammen.
Die Mystifizierung und der Hang zur Metaphysik waren und sind weit verbreitet. Im Säuglings- und Kleinkindalter führen wir vielerlei Dinge aus ohne deren umgangssprachliche, geschweige denn wissenschaftliche Bezeichnung zu kennen.
Begriffe helfen uns mit anderen Menschen zu kommunizieren.
Die Bestimmung eines eindeutigen und erklärendes Begriffes ist ein äußerst schwieriges Unterfangen und führt auch in die Tiefen der Sprachlehre (Linguistik) und der Geschichte der Menschheit. Mittlerweile unternehmen viele Menschen erst gar nicht den Versuch diese Kriterien zu erfüllen und so kommt es zu Namen wie Python oder BASH.
Akronyme können diesen Ansatz verfolgen, aber oft wird eben nicht erreicht, dass der Name eines Werkes selbsterklärend ist.
Ein germanischer Vorname wie Volkward impliziert gewisse Eigenschaften und Charakterzüge des Menschen und kann zu Erwartungen führen, die dieser Mensch nicht erfüllt, da wir oft nicht wissen wie sich ein Mensch entwickelt, werden mittlerweile Vornamen verwendet deren nähere Bedeutung nicht bekannt sind oder die es schlicht und ergreifend nicht gibt. So darf man ruhigen Gewissens eine neue Linuxdistribution Paula oder Nano nennen. Von der Beeinflussung durch gewisse Trends ganz zu schweigen.
Arbeitweise
Eine UNIX Shell ist beides: Kommandozeileninterpreter und Programmiersprache. Als Kommandozeileninterpreter stellt die Shell eine Schnittstelle zu der großen Sammlung von GNU-Programmen und anderen Programmen dar. Die Funktion als Programmiersprache erlaubt das Kombinieren und die Zusammenarbeit dieser Programme. Dateien die Kommandos enthalten, können erstellt und als Kommando behandelt werden. Diese so erstellten Kommandos erhalten den gleichen Status wie Programme die beispielsweise in /bin geführt werden. Dies gestattet Benutzern und Benutzergruppen die Anpassung ihrer Arbeitsumgebung und die Automatisierung üblicher Aufgaben.
Eingabezustände
Eine Shell kann interaktiv oder nichtinteraktiv arbeiten. Im interaktiven Modus werden Tastatureingaben verwendet, im nichtinteraktiven Modus werden Kommandos aus einer Datei gelesen.
Gleichzeitigkeit
Eine Shell erlaubt die Ausführung von GNU Kommandos, snychron und asynchron. Die Shell wartet auf die Abarbeitung synchroner Kommandos bevor Sie eine neue Eingabe akzeptiert. Asynchrone Kommandos werden ausgeführt, während parallel dazu neue Eingaben möglich sind. Das Umleitungskonzept gewährt sehr präzise Steuerungmöglichkeiten für die Ein- und Ausgabe der Kommandos. Zudem bietet die Shell die Möglichkeit der Änderung der Kommandoumgebung.
Interne Kommandos
Die Shell bietet eine Sammlung von internen Kommandos mit eingebetteter Funktionalität, die externe Programme gar nicht oder nur unzureichend erfüllen können.
Beispielsweise können cd, break, continue und exec nicht ausserhalb von BASH liegen, da sie die BASH direkt manipulieren.
Die internen Kommandos history, getopts, kill, pwd und andere, könnten sehr wohl durch externe Programme ersetzt werden, allerdings wäre dies eher ungeeignet.
Alle internen Kommandos werden in den nachfolgenden Kapiteln beschrieben.
Ansprechbar für andere Programmiersprachen
Während Kommandoausführung existenziell ist, entfaltet sich durch die eingebettete Programmiersprache eine enorme Leistungsfähigkeit und Komplexität. Wie jede maschinenfernere (der natürlichen Sprache nähere) Programmiersprache bietet diese Shell Variablen, Steuerungskonzepte und Notierungsmittel an, und ermöglicht so einen überwältigenden Funktionsumfang.
Weitere Fähigkeiten
Die Shell bietet einige Leistungsmerkmale die speziell für die interaktive Benutzung zugeschnittenen sind, statt die eigene Programmiersprache zu überladen. Zu diesen Leistungsmerkmalen gehören die Auftragssteuerung, Kommandozeilenmanipulation, Kommandoverlauf und Kommandosynonyme. Jedes dieser Leistungsmerkmale wird in diesem Handbuch näher beleuchtet.
Was ist BASH?
Was macht BASH?
BASH ist eine Shell für das GNU-Betriebssystem.
Woher stammt der Name?
Der Name ist ein Akronym für "Bourne-Again SHell", ein Wortspiel um Stephen Bourne, dem Author des direkten Vorgängers der UNIX-Shell SH, welche mit der siebten Ausgabe von Bell Labs Research UNIX erschien.
"Bourne-again" wird als "born again" gesprochen und bedeutet wiedergeboren.
Einordnung in die Welt der Shell's
BASH ist in weiten Teilen zu SH kompatibel und birgt nützliche Leistungsmerkmale der Korn Shell (ksh) und der C Shell.
BASH strebt die Implementierung der POSIX Shell Konventionen und deren Werkzeuge an, gemäß IEEE Posix (IEEE Standard 1003.1). Er bietet funktionelle Verbesserungen, für den interaktiven und programmierten Gebrauch.
Portierung
Das GNU Betriebssystem bietet mehrere Shell's zur Verwendung an. Allerdings ist BASH der Standard. BASH kann, wie andere GNU Programme auch, gut an andere Betriebssysteme und Rechnerarchitekturen angepasst werden. Gegenwärtig ist BASH nahezu auf jedem UNIX lauffähig, sowie auf einigen anderen Betriebssystemen. Es bestehen unabhängige Portierungen für MS-DOS, OS/2 und MS-Windows.
Grundlegende Shell Funktionen
Dieses Kapitel ist eine kurze Zusammenfassung der wesentlichen Bestandteile: Kommandos, Kontrollstrukturen, Shell Funktionen, Shell Parameter, Shell Erweiterungen, Umleitungen (welche die direkte Ein- und Ausgabe von und zu benannten Dateien ermöglichen) und wie die Shell Kommandos ausführt.
Shell Syntax: Der Aufbau der Benutzereingaben.
Eingelesene Eingaben durchlaufen eine Sequenz von Operationen. Zeigt die Eingabe auf einen Kommentar, ignoriert die Shell das Kommentarsymbol (‘#’) und den Rest der Zeile.
Die Shell liest die Eingabe und unterscheidet zwischen Worten und Operatoren. Sie berücksichtigt die Regeln für die Notierung und ordnet den Worten und Zeichen eine Bedeutung zu.
Danach werden diese Token analysiert und in Kommandos und andere Konstruktionen unterschieden. Entnimmt Spezialbedeutungen von Wörtern oder Zeichen, erweitert andere, leitet Ein- und Ausgabe nach den Erfordernissen um, für das Kommando aus, erwartet den Rückgabewert und stellt ihn für weitere Aktionen zur Verfügung.
Shell Operationen: Grundlegende Shell Operationen.
Shell Operationen während des Einlesens und Ausführens. In groben Zügen macht die Shell folgendes:
1. Lesen der Eingabe aus einer Datei (siehe Shell Skripte), aus einer Zeichenkette, übergeben aus Parametern der -c Option (siehe BASH aufrufen) oder interaktiv aus dem Terminal.
2. Trennt die Eingabe in Worte und Operatoren, brücksichtigt die Regeln zur Notierung. Die Teilstücke werden logisch durch Metazeichen getrennt. An diesem Punkt wird die Synonymerweiterung vollzogen, d.h. die Shell prüft, ob es sich um einen Stellvertreter des eigentlichen Kommandos handelt (siehe Kommandostellverter/Kommandosynonyme).
3. Aufsplittung der Teilstücke in einfache, verkettete Kommandos (siehe Shell Kommandos).
4. Wendet die verschiedenen Erweiterungen an (siehe Shell Erweiterungen), teilt the erweiterte Teilstücke in eine Liste von Dateinamen (siehe Dateinamenerweiterung), Kommandos und Parameterangaben.
5. Durchführung jeglicher notwendiger Umleitungen (siehe Umleitungen), entfernt die Umleitungsoperatoren und ihre Operanden aus der Liste der Parameterangaben.
6. Führt das Kommando aus (siehe Kommandosausführung).
7. Optinonal warte die Shell auf die Beendigung des Kommandos und liest den Rückgabewert aus (siehe Rückgabewert).
Notierungsarten: Wie man die Shell dazu bringt, reservierte Zeichen zu ignorieren.
Drei unterschiedliche Notierungsarten sind möglich: Das Schlupfzeichen, einfache Anführung und doppelte Anführung.
Die Notierungsarten erlauben der Shell, die besondere Bedeutung reservierter Zeichen und Wörter zu ignorieren. Jedes der Shell Metazeichen (siehe Definitionen) hat eine spezielle Bedeutung für die Shell. Eine der Notierungsarten muss verwendet werden, wenn sich das Zeichen selbst darstellen soll.
Beispiel: Wird ein bestimmter Mechanismus des Kommandoverlaufes (siehe Verlaufskontrolle) genutzt und das Ausrufezeichen ! verwendet, wird es gewöhnlich mit einfachen Anführungszeichen umschlossen damit es nicht als Steuerungszeichen für den Kommandoverlaufsmechanismus (siehe Verlaufsmechanismen) mißdeutet wird.
Schlupf-Zeichen: Das Zeichen, das reservierten Zeichen die spezielle Bedeutung nimmt.
Das Schlupfzeichen der BASH ist ist der Rückschrägstrich: \. Er belegt seinen Auslesewert gewöhnlich auf der gleichen Taste wie das scharfe S: ß. Erzeugt wird das Zeichen durch drücken der Taste rechts der Leertaste (oft bedruckt mit Alt Gr, Alternate great). Diese allein Taste erzeugt keinen auslesbaren Wert, sie dient als Modifikator. Also \, der nach rechts geneigte Schrägstrich wird durch drücken von Alt Gr + ß erreicht.
\ erhält die Selbstdarstellung des nächst folgenden Zeichens mit der Ausnahme einer neuen Zeile. Wird \neue_Zeile eingelesen, wird diese Zeichenfolge als Zeilenfortführung behandelt, also wird neue_Zeile ignoriert.
Einfache Anführungszeichen: Unterdrückung jedweder Interpretation einer Zeichensequenz.
Das Umschließen von Zeichen durch einfache Anführungszeichen ' gewährleistet die ursprüngliche Bedeutung innerhalb der Anführungszeichen. Ein einzelenes, einfaches Anführungszeichen darf nicht eingeschlossen sein, selbst wenn ein Rückschrägstrich \ davor steht.
Doppelte Anführungszeichen: Unterdrückung der meisten Interpretationen einer Zeichensequenz.
Das Umschliessen von Zeichen mit doppelten Anführungszeichen " stellt die ursprüngliche Bedeutung aller enthaltenen Zeichen sicher. Ausnahmen: $ ` \ und wenn die Verlauferweiterung aktiv ist, das !.
Die Zeichen $ und ` erhalten ihre besondere Bedeutung (siehe Shell Erweiterungen). Der Rückschrägstrich \ erhält seine besondere Bedeutung nur, wenn $ ` " \ oder neue_Zeile direkt folgen. Rückschrägstriche \ in doppelten Anführungszeichen werden dann von BASH entfernt. Rückschrägstriche, die Zeichen ohne besonderer Bedeutung vorangehen, bleiben unmodifiziert.
Doppelte Anführungszeichen innerhalb einer, von doppelten Anführungszeichen umschlossenen, Zeichenkette müssen mit einem Rückschrägstrich angekündigt werden:
"Hans sagt:\"Hallo\"" - so werden die eingeschlossenen doppelten Anführungszeichen als gewöhnlicher Text behandelt.
Ist die Verlaufsfunktion aktiviert, wird diese bei einem in doppelten Anführungszeichen auftauchenden Ausrufezeichen ! tätig, dies kann durch einen Rückschrägstrich \ verhindert werden.
Der sechsstrahlige Stern (auch Asterisk bezeichnet) * und der Klammeraffe @ (umgangssprachlich, engl. at, lat. ad) behalten ihre Spezialedeutung innerhalb von doppelten Anführungszeichen (siehe Shell Parameter Erweiterungen).
ANSI-C Notation: Verwendung der ANSI-C Notation in BASH.
Zeichenfolgen in Form von $'Zeichenfolge' werden gesondert behandelt. Diese Zeichenfolgen werden zu Zeichensequenzen erweitert. Zu Sequenzen, mit einem Rückschrägstrich \ versehenen und von bestimmten Zeichen gefolgt, wie im ANSI-C Standard festgelegt.
Diese Rückschrägstrichsequenzen haben folgende Bedeutungen.
\a
Alarm (Klingel, Glocke)
\b
Rückschritt
\e
Schlupfzeichen wie \ in BASH (kein ANSI C)
\f
Formular Vorschub
\n
neue Zeile
\r
Sprung zum nächsten Zeilenanfang
\t
horizontaler Zwischenraum (t für Tabulator)
\v
vertikaler Zwischenraum
\\
Rückschrägstrich
\'
einfaches Anführungszeichen
\nnn
8 Bit wertige Zeichenfolge, dessen Wert oktal angegeben wird (ein bis drei Ziffern)
\xHH
8 Bit wertiges Zeichenfolge, dessen Wert hexal angegeben wird (ein oder zwei Ziffern)
\cx
ein x-Steuerzeichen
Das so erweiterte "Ergebis", die Sequenz, steht in einfachen Anführungszeichen, als ob das Dollarzeichen $ nicht vorhanden gewesen wäre.
Übersetzung: Konvertierung in andere Sprachen.
Doppelte Anführungszeichen ", denen das Dollarzeichen $ voran geht, werden gemäß der zugehörigen Sprache übersetzt. Handelt es sich dabei um C oder POSIX, wird das Dollarzeichen $ ignoriert.
Wird die Zeichensequenz konvertiert und ersetzt, ist dieser Ersatz von doppelten Anführungszeichen umschlossen.
Einige Systeme nutzen den Meldungskatalog gemäß der Shell Variable LC_MESSAGES (LC = locale, Message = Meldung). Andere erstellen den Namen des Meldungskataloges anhand des Wertes der TEXTDOMAIN (Textbereich) Shell Variable, möglicherweise unter Hinzufügung des Suffix .mo. Wird die Variable TEXTDOMAIN verwendet, ist es vermutlich erforderlich die Variable TEXTDOMAINDIR (Textbereichsverzeichnis) zu setzen. Sie sollte auf den Platz eben dieses Verzeichnisses zeigen.
Wieder andere Systeme nutzen beide Variablen nach dieser Weise: TEXTDOMAINDIR/LC_MESSAGES/LC_MESSAGES/TEXTDOMAIN.mo.
Kommentare: Wie Kommentare notiert werden.
Eine Zeichenfolge beginnend mit dem Rautenzeichen # bewirkt eine Nichberücksichtung der gesamte Zeile. Dies gilt bei einer nichtinteraktiven Shell oder einer interaktiven Shell, in der der Parameter interactive_comments für das interne Kommando (siehe interne Kommandos) shopt aktiviert ist. Eine interaktive Shell ohne gesetztes interactive_comments erlaubt keine Kommentare. In interaktiven Shells ist der Parameter für gewöhnlich gesetzt. Siehe interaktive Shell, für eine Beschreibung was eine interaktive Shell ausmacht.
#Dies ist ein Kommentar.
Achten Sie darauf, dass ihr erster Kommentar kein Ausrufezeichen ist. Die Zeichenfolge #! ist reserviert. Im Englischen "Shebang" und "magic line" genannt und wird zu einem späteren Zeitpunkt erklärt.
Shell Kommandos: Verwendbare Kommandotypen.
3.2 Shell Kommandos
Ein einfaches Kommando wie echo a b c besteht aus dem Kommando selbst, gefolgt von Angaben die durch Leerzeichen voneinander getrennt werden.
Komplexere Kommandos werden aus einfachen Kommandos zusammengesetzt. Dies wird über verschiedene Wege erreicht:
- Durch eine Weiterleitung, in der die Ausgabe eines anderen Kommandos zur Eingabe wird.
- Durch eine Schleife, oder eine bedingte Strukturierung.
- Durch andere Zusammenfassungen.
Einfache Kommandos: Der häufigste Kommandotyp.
Einfache Kommandos
Einfache Kommandos begegnen uns am häufigsten. Es ist eine Folge von Wörtern oder Zeichen, getrennt durch Leerzeichen und beendet durch einen der Steueroperatoren (siehe Definitionen). Das erste Wort bestimmt das auszuführende Kommando, der nachfolgende Teil sind die Angaben.
Der Rückgabewert (siehe Endstatus) eines einfachen Kommandos ist sein Endstatus, wie es der POSIX Standard 1003.1 mit sich bringt, genauer: Die Funktion waitpid (warte|Prozess ID); oder 128+n wenn das Kommando durch ein Signal n beendet wurde.
Weiterleitungen: Kommandoausgaben an andere Kommandos übergeben.
Eine Weiterleitung ist eine Kommandofolge die durch den senkrechten Strich | getrennt wird. Dabei wird folgende Formatvorlage verwendet:
[time [-p]] [!] Kommando 1 [| Kommando 2]
Die Ausgabe jedes Kommandos, welches sich in der Reihe der Weiterleitungen befindet, wird zur Eingabe des darauf folgenden Kommandos. Dadurch liest jedes Kommando die Ausgabe seines Vorgängers.
Beispiel:
[Hans@mobiler_Rechner1]$ cat ~/.bashrc | grep aliases
Gibt den Inhalt der, im Heimverzeichnis (angezeigt durch ~) befindlichen, Datei .bashrc aus, leitet den Inhalt weiter an das Kommando grep, dieses Kommando lokalisiert alle Zeilen in denen das Wort aliases steht und gibt diese Zeilen aus.
Das reservierte Wort time gibt eine Statistik, über verbrauchte Zeit für diese Weiterleitung, aus. Für die Statistik werden Minuten, Sekunden und Millisekunden als Zeitangaben verwendet.
Beispiel für die Ausgabe einer solchen Statistik:
real 0m0.003s user 0m0.000s sys 0m0.003s
Sie beinhaltet die tatsächlich vergange Zeit (wall-clock, Wanduhr), sowie Benutzer- und Systemzeit die zur Ausführung des Kommandos erforderlich war.
Der Parameter -p verändert das Ausgabeformat ins POSIX-Format. Die Variable TIMEFORMAT kann zur Änderung des Ausgabeformates verändert werden. Siehe BASH-Variablen für eine Beschreibung der möglichen Formate. Die Verwendung des reservierten Wortes time ermöglicht die Zeitmessung aller internen Kommandos, Funktionen und Weiterleitungen. Ein externes Zeitmessungsprogramm wird hier schnell seine Grenzen finden.
Wird die Weiterleitung nicht asynchron durchgeführt, wartet BASH auf die Beendigung aller Kommandos.
Jedes Kommando in einer Weiterleitung wird in seiner eigenen Sub-Shell ausgeführt (siehe Kommandoausführungsumgebung). Der Endzustand einer Weiterleitung ist der des zuletzt ausgeführten Kommandos in der Weiterleitungskette. Es sei denn, die Option pipefail (Versagen der Weiterleitung) wurde eingeschaltet(siehe internes Kommando set). Wurde pipefail aktiviert, ist der Rückgabewert der Weiterleitung, der Zustand des letzten Kommandos welches mit einem anderen Wert als Null 0 beendet wird oder Null 0, wenn alle Kommandos erfolgreich ausgeführt wurden.
Rückgabewert ist Null 0.
Um den Rückgabewert auszulesen kann folgender Ausdruck verwendet werden:
[Jürgen@Mainframe ~]$ echo $?
Führt das reservierte Ausrufezeichen ! die Weiterleitung an, ist der Rückgabewert eine logische Negierung des Endzustandes, wie er vorher beschrieben ist. BASH wartet auf Beendigung aller Kommandos vor Ausgabe des Wertes.
Kommandofolgen: Sequentielles Ausführen von Kommandos.
Eine Kommandosequenz besteht aus zwei einfachen oder weitergeleiteten Kommandos, die durch folgende Operatoren: ;, &, &&, oder || getrennt werden. Optional können diese, durch folgende Operatoren abgeschlossen werden: ;, &, neue_Zeile.
Die Operatoren && und ||, sowie ; und & sind identisch.
Eine Sequenz aus einer oder mehreren Zeilenumbrüchen darf, gleibedeutend dem Semikolon ;, zur Abgrenzung eingesetzt werden, .
Wird ein Kommando durch den Konrtolloperator & abgeschlossen, für BASH das Kommando asynchron (eigenständig) in einer Subshell (Untershell) aus. Dies wird als Ausführen im Hintergrund bezeichnet. BASH wartet nicht auf das Ergebnis des Kommandos und der Rückgabewert ist Null 0 (wahr). Ist die Auftragssteuerung nicht aktiv (siehe Auftragssteuerung), wird die Standardeingabe für asynchrone Kommandos, falls keine ausgewiesene Umleitung aktiv ist, von /dev/null umgeleitet.
Kommandos die durch ein Semikolon ; getrennt sind, werden nacheinander ausgeführt. BASH wartet auf die Beendigung eines Kommandos, um danach das nächste auszuführen.
Beispiel:
[Systemverwalter@Zimmer208] #wget $URL; shutdown -h now
Den Rückgabewert liefert das zuletzt ausgeführte Kommando.
Die Steuerungsoperatoren && und || kennzeichen UND-Folgen und ODER-Folgen.
Eine UND-Folge wird in folgender Weise erstellt:
Kommando 1 && Kommando 2
Kommando 2 wird nur dann ausgeführt, wenn Kommando 1 erfolgreich war, also den Rückgabewert Null 0 lieferte.
Eine ODER-Folge wird in folgender Weise erstellt:
Kommando 1 || Kommando 2
Kommando 2 wird nur dann ausgeführt, wenn Kommando 1 nicht erfolgreich war, also den Rückgabewert Null 0 lieferte.
Der Rückgabewert von UND oder ODER Kommandofolgen ist der Wert des zuletzt ausgeführten Kommandos.
Zusammengesetzte Kommandos: Programmiermechanismen
Zusammengesetzte Kommandos sind das Gerüst der Shell-Programmierung. Jedes so erstellte Konstrukt beginnt mit einem reservierten Zeichen oder Wort, einem Kontrollzeichen und wird auch wieder mit Solchen beendet. Jede Umleitung die mit einem zusammengesetzten Kommando in Verbindung steht, besteht für alle Kommandos in diesem Gerüst, bis sie ausdrücklich aufgehoben wird.
BASH unterstützt Konstrukte dieser Art durch Schleifen, bedingte Kommandos und Mechanismen, die es erlauben zusammengesetze Kommandos als Einheit auszuführen.
Schleifen Konstrukte: BASH Kommandos für sich wiederholende Aktionen
BASH unterstützt folgende Schleifenkonstrukte:
Anmerkung: Wo immer ein Semikolon ; in der Beschreibung des Kommandosyntax steht, kann es durch ein oder mehrere /n neue Zeile ersetzt werden.
until vereinfachter Syntax:
until test-Kommandos; do ständige Kommandos; done
Führt ständige-Kommandos aus, bis test-Kommandos einen Endstatus von Null 0 erreichen. Der Rückgabewert ist der Endzustand des letzten ausgeführten ständigen Kommandos, wurde keines ausgeführt Null 0.
while vereinfachter Syntax:
while test-Kommandos; do ständige-Kommandos; done
Führt ständige-Kommandos aus, bis test-Kommandos Null 0 als Zustandbeschreibung ausgeben. Der Rückgabewert ist der Endzustand des letzten Kommandos der ständige-Kommandos-Kette, wurde keines ausgeführt Null 0.
for vereinfachter Syntax:
for Angabe(n) [in Liste von Variablen]; do Kommandos; done
Sinngemäß: Solange (for) ein Wert vorhanden ist; mache (do) Kommando.
In der Liste von Variablen dürfen Platzhalter verwendet werden.
Das auf do folgende Kommando wird im Zusammenhang mit Angabe(n), und jedem Eintrag der optionalen Liste, ausgeführt. Wird in nicht verwendet, d.h. es wird auf eine Liste verzichtet, führt das Kommando for die Kommandos einmal pro positionalem Parameter aus, so als ob in $@ angegeben worden wäre (siehe spezielle Parameter). Der Rückgabewert ist der Endzustand des zuletzt ausgeführten Kommandos. Fehlen die Angabe(n), werden keine Kommandos ausgeführt und der Rückgabewert ist Null 0.
Beispiel:
[Osama@Zimmer208]# for Zahlen in 1 2 3 4 5 6 7 8 9; do echo $Zahlen; done
Eine Alternative zur obigen Lösung:
for (( Ausdruck1 ; Ausdruck2 ; Ausdruck3 )) ; do Kommandokette ; done
Zunächst wird der mathematische Ausdruck1, gemäß den mathematischen Regeln der BASH (siehe BASH Arithmetik), ausgewertet. Ausdruck2 wird wiederholt ausgeführt, bis er Null 0 zurück gibt. Jedesmal wenn Ausdruck2 ungleich Null 0 ist, wird Kommandos ausgeführt und Ausdruck3 ermittelt. Wird ein Ausdruck ausgelassen, wird er als 1 behandelt. Der Rückgabewert ist der Endzustand des letzten Kommandos der Kommandokette, das ausgeführt wurde oder false (falsch) wenn ein Ausdruck ungültig ist.
Die internen Kommandos break und continue können zur Schleifenflusssteuerung verwendet werden.
Bedingungs-Konstrukte: Kommandos abhängig von Bedingungen ausführen.
if falls, wenn vereinfachter Syntax:
if Test-Kommandos; then (dann) ständige-Kommandos; [elif (else if - andernfalls wenn) mehr-Test-Kommandos; then (dann) mehr-ständige-Kommandos;] [else (andernfalls) andere-ständige-Kommandos;] fi <- if rückwärts geschrieben, bezeichnet das Ende des Konstruktes.
Die Folge von Test-Kommandos wird ausgeführt, nach Rückgabewert Null 0, die ständigen-Kommandos. Andernfalls wird jedes elif der Reihe nach abgearbeitet, nach Rückgabewert Null 0 werden mehr-ständige-Kommandos ausgeführt, sonst andere-ständige-Kommandos.
Das letzte Kommando entscheidet über den Rückgabewert, wurde keine Bedingung erfüllt ist er Null 0.
case bestimmter Fall
vereinfachter Syntax:
case Wort in [ [(] Muster [| Muster] usw ) Kommandofolge ;;] ... esac
case führt selektiv, das dem Muster, entsprechende Kommando aus. Wurde die BASH Option nocasematch (siehe shopt in BASH interne Kommandos) gesetzt, bleibt Groß- und Kleinschreibung unberücksichtigt. Der senkrechte Strich | trennt mehrere Muster und die schließende Runde Klammer ) signalisiert das Ende der Liste. Eine Liste von Mustern mit dem oder den zugehörigen Kommando(s) wird als Fall bezeichnet. Jeder dieser Abschnitte muss mit zwei Semikolon beendet werden.
Das Wort kann Übergaben von Tilde (~) (lateinisch titulus „Überschrift, Überzeichen“)(Zeichen für proportional), Parametern, Kommandos, arithmetischen Ausdrücken erhalten und die Notierung kann manipuliert werden bevor es verglichen wird.
Die Anzahl der Fälle kann frei gewählt werden, aber jeder einzelne Fall muß entsprechend beendet werden. Das erste passende Muster bestimmt die auszuführende Kommandoliste.
Hier ein Beispiel für die Benutzung von case in einem Skript, welches ein anatomisches Merkmal eines Tieres wiedergibt:
echo -n "Geben Sie den Namen eines Tieres ein: " # -n keinen Zeilenumbruch
read TIER # lese die Eingabe in die Variable TIER
echo -n "Das $TIER hat "
case $TIER in
pferd | hund | katze) echo -n "vier";;
affe | kängeruh ) echo -n "zwei";;
*) echo -n "eine unbekannte Anzahl";;
esac # Case rückwärts als Zeiger für das Konstruktende
echo " Beine."
Trifft kein Fall zu, ist der Rückgabewert Null 0. Andernfalls wird der Rückgabewert durch das zuletzt ausgeführte Kommando bestimmt.
select wähle
Das select-Konstrukt erlaubt, auf einfache Weise, das Erstellen von Eingabemenüs
Sein Syntax ähnelt dem von for stark:
select Variable [in Auswahl ...]; do Kommandos; done # fertig
Die Angaben in der Auswahl, nach in können zu einer Liste von Dingen erweitert werden. Die Liste wird an den üblichen Fehlerausgabestrom gesendet, jeder Listenpunkt erhält eine Nummer. Wird auf eine Liste verzichtet, werden die positionalen Parameter wie in in "$@" angeben behandelt. Die Eingabeaufforderung PS3 wird gezeigt und eine Zeile wird von der Eingabe gelesen. Enthält die gelesene Zeile eines den Angaben entsprechenden Wörtern, ersetzt der Wert das zugehörige Wort. Bleibt die Zeile leer, wird die Eingabeaufforderung erneut gezeigt. Wird EOF (Ende der Reihe, auch Ende der Datei) gelesen, ist select beendet. Jeder nicht entsprechenden Angabe wird der Wert Null 0 zugewiesen. Der Inhalt der Eingabe wird in die Variable REPLY (Antwort) gelesen.
Nach jeder Auswahl werden die Kommandos bis zu einem break (Unterbrechung) ausgeführt, an dem Punkt ist select beendet.
Hier ein Beispiel das dem Benutzer die Auswahl eines Dateinamens aus dem aktuellen Verzeichnis erlaubt. Der Name und Index der Datei werden ausgeben.
select dname in *; # Zeigt alle Dateien im aktuellen Verzeichnis an und gestattet eine Auswahl do # Mache (folgendes) echo Sie wählten $dname \($REPLY\) # Gibt Namen und Wert der Auswahl wieder break; # Unterbrechung done # fertig
((...))
(( Ausdruck ))
Ein arithmetischer Ausdruck wird nach den folgenden Regeln ermittelt (siehe BASH Arithmetik). Ist das Erbegnis nicht Null 0, beträgt der Rückgabewert Null 0, andererseits Eins 1. Das entspricht
let "Ausdruck" # let bedeutet lassen
Siehe BASH interne Kommandos für eine detaillierte Beschreibung seiner Funktion.
[[...]]
[[ Ausdruck ]]
Der Rückgabewert ist Null 0 oder Eins 1, abhängig vom ermittelten Wert der bedingten Ausdruckes. Die Ausdrücke setzen sich aus den Hauptbestandteilen zusammen, die nachfolgend in "BASH - Bedingte Ausdrücke" beschrieben sind.
Wortaufsplittung und Dateinamenübergaben werden nicht unterstützt in Ausdruckteilen zwischen den eckigen Klammern [[ und ]]; Proportionalzeichen-, Parameter-, Variablen-, Arithmetik-, Kommando-, Prozessübergaben und Notierungsarten werden unterstützt. Bedingte Operatoren, wie -f, müssen ausnotiert werden, um als Hauptbestandteil berücksichtigt zu werden
Werden die Operatoren == und != benutzt, wird die Zeichenfolge rechts derer als Muster, entsprechend den Regeln der Mustervergleiche, wie nachfolgend beschrieben, verglichen. Wurde die BASH Option nocasematch (siehe shopt in BASH interne Kommandos) gesetzt, bleibt Groß- und Kleinschreibung unberücksichtigt.
Entspricht die Zeichenkette dem Operatoren == oder nicht dem Operatoren != ist der Rückgabewert Null 0, andernfalls Eins 1. Jeder Teil des Musters kann durch Notierung als Zeichenkette markiert werden. Mit =~ ist ein weiterer boolischer Operator verfügbar, er ist == und != rangeben.
Bei seiner Benutzung wird die Zeichenkette rechts von ihm als übergebener regulärer Ausdruck behandelt und geprüft (wie in regex3)).
Der Rückgabewert ist Null 0 wenn die Zeichenfolge dem Muster entspricht, sonst Eins 1. Ist der übergebene Ausdruck syntaktisch unkorrekt ist der Rückgabewert 2. Wurde die BASH Option nocasematch (siehe shopt in BASH interne Kommandos) gesetzt, bleibt Groß- und Kleinschreibung unberücksichtigt. Entsprechen Teilzeichenfolgen in Klammern gesetzten Teilausdrücken im des regulären Ausdruckes werden sie in der Feldvariablen BASH_REMATCH (REgulärer Treffer) abgelegt.
Ein Element aus BASH_REMATCH mit dem Zähler (Index) 0 ist ein Teil des Zeichenfolgenvergleiches des gesamten regulären Ausdruckes. Ein Element aus BASH_REMATCH mit dem Zähler n ist ein Teil des n'ten eingeklammerten Teilausdruckes.
Ausdrücke können durch folgende Operatoren kombiniert werden. Auflistung in absteigender Rangfolge:
( Ausdruck ) Gibt den Wert des Ausdruckes zurück. Kann zur Nutzung des Übergehens der Reihenfolge genutzt werden.
! Ausdruck Wahr, wenn der Ausdruck falsch ist. Ausdruck1 && Ausdruck2 Wahr, wenn beide Ausdrücke wahr sind. Ausdruck1 || Ausdruck2 Wahr, wenn ein Ausdruck wahr ist.
Die Operatoren && und || ermitteln nicht den Wert von Ausdruck2, wenn der Wert von Ausdruck1 ausreichend ist, um die Bedingung für den gesamten Ausdruck zu erfüllen.
Kommandos gruppieren: Zusammenfassen von Kommandos
BASH ermöglicht auf zwei Wege Kommandos zu einer Einheit zusammenzufassen. Werden Kommandos gruppiert, werden Umleitungen für die gesamte Einheit aktiv. Z.B. wird Ausgabe auch zu einem einzelen Datenstrom.
() Runde Klammern
( Liste )
Zwischen runden Klammern gesetzt, wird eine Komanndokette in einer erstellten Untershell ausgeführt. (siehe Kommandoausführungsumgebung) und jedes Kommando in dieser Untershell ausgeführt. Wird diese geschlossen, sind Variablen die dort zugewiesen wurden nicht mehr verfügbar.
{} Geschweifte Klammern
{ Liste; }
So markierte Kommandoketten werden in der aktuellen Shell ausgeführt. Ein Semikolon oder eine neue Zeile sind erforderlich.
Abgesehen von der Untershellerstellung, besteht ein kleiner, geschichtlich bedingter, Unterschied zwischen diesen beiden Notierungsarten. Geschweifte Klammern sind reservierte Zeichen, deshalb müssen sie durch ein Leerzeichen von den Kommandos getrennt werden. Die runden Klammern sind Operatoren und werden als solche, auch ohne besondere Abgrenzung behandelt. Der Rückgabewert von beiden ergibt sich aus der Kommandoliste.
Funktionen: Eigene Funktionen erstellen.
Funktionen sind eine Möglichkeit, Kommandos in Gruppen zu fassen, diese Gruppe zu benennen und zu einem späterem Zeitpunkt auszuführen. Sie werden exakt so ausgeführt wie ein gewöhnliches Kommando. Wird der Name einer Funktion, anhand ihres Namens als Kommando verwendet, werden die so gruppierten Kommandos ausgeführt. Funktionen werden in der gegenwärtigen Shell ausgeführt; für die Umsetzung wird kein neuer Prozess erstellt.
Funktionen werden durch folgenden Syntax erstellt:
[ function ] Name () Zusammengesetztes Kommando [ Umleitung ]
Das reservierte Wort function muss nicht zwingend angegeben werden. Ein Name für die Shell-Funktion kann frei gewählt werden, die runden Klammern dahinter sind nur erforderlich, wenn das reservierte Wort function nicht angeben wurde.
Entweder
function Testfunktion
oder
Testfunktion ()
Der Inhalt der Funktion besteht aus einem zusammengetzten Kommando (siehe zusammengesetzte Kommandos). Es ist üblich zusammengesetzte Kommandos in Funktionen durch geschweifte Klammern einzuschließen, allerdings sind alle Notierungsarten, wie vorher beschrieben zulässig. Die Funktion wird immer dann ausgeführt, wenn ihr Name als Kommando verwendet wird. Umleitungen können in Funktionen verwendet werden und werden bei jeder Ausführung der Funktion aktiv.
Eine definierte Funktion kann mittels unset -f (siehe interne Kommandos) entfernt werden.
Der Rückgabewert einer Funktion ist Null 0, außer es wurde ein Fehler im Syntax gemacht oder es besteht bereits eine Funktion mit selbem Namen und diese ist schreibgeschützt. Wurde die Funktion ausgeführt, liefert das letzte Kommando in der Funktion den Rückgabewert.
Anmerkung: Die geschweiften Klammern müssen durch ein Leerzeichen oder einen Zeilenumbruch von den Kommandos getrennt sein, dies ist durch die Entstehungsgeschichte der BASH bedingt.
Die geschweiften Klammern sind reservierte Zeichen und werden als Solche nur erkannt, wenn sie durch Leerzeichen von anderen Zeichen getrennt stehen. Nach der schließenden geschweiften Klammer }, die das Ende der Liste anzeigt, muss ein Semikolon, ein kaufmännisches Und-Zeichen & oder ein Zeilenumbruch stehen.
Beispiel für eine Funktion die der lokalen .bashrc angehängt wird:
[root@nasa_ws_666 ~]# echo 'backdatt() { time ./configure && make && make install };' >> .bashrc
Nach erneuter Anmeldung oder nach erneutem Einlesen der Datei .bashrc durch das Kommando bash, steht ein neues Kommandos zur Verfügung.
Wird eine Funktion aufgerufen, werden die Argumente während der Ausführung zu positionalen Parametern (siehe positionale Parametern). Der besondere Parameter, die Raute #, der die Anzahl der jeweiligen positionalen Parameter enthält, wird aktualisiert. Der besondere Parameter 0 bleibt unberührt.
Das erste Feld der Variable FUNCNAME wird durch den Namen der jeweils ausführenden Funktion. Alle anderen Aspekte der Shell Ausführungsumgebung zwischen der Funktion und ihrem Aufrufer sind identisch, mit der Ausnahme der Abfang-Kommandos debug (Fehlersuche) und return (Rücksprung), welche normalerweise nicht übergeben werden, es sei denn, die trace (Abfang) Eigenschaften wurden aktiviert. Dies kann durch das interne Kommando declare oder der Paramter -o und die Angabe functrace zum internen Kommando set. Siehe BASH interne Kommandos für eine Erklärung von trap. Wird das interne Kommando return in einer Funktion ausgeführt, wird die Funktion beendet und fährt mit dem nächsten Kommando nach dem Funktionsaufruf fort. Alle Kommandos, die durch return abgefangen wurden, werden ausgeführt bevor die Ausführung fortgesetzt wird.
Nach Beendigung der Funktion wird der Wert der positionalen Paramtern und der Wert in # zurückgesetzt auf die vorherigen Werte, bevor die Funktion ausgeführt wurde.
Ist ein numerisches Argument als Rückgabe vorgesehen, ist dieses der Rückgabewert der Funktion; andernfalls bestimmt das letzte Kommando, welches vor dem Rücksprung ausgeführt wurde.
Lokale Variablen der Funktion werden über das interne Kommando local gesetzt. Diese Variablen sind lediglich für die Funktion und deren Kommandos verwendbar.
Funktionsnamen und -definitionen können über den Parameter -f der internen Kommandos declare oder typeset abgerufen werden. -F gibt nur den Funktionsnamen aus (, bei Bedarf auch den Namen der Quelldatei und die entsprechende Zeilennummer, falls extdebug aktiv ist).return Funktionen können über das interne Kommando export und dessen Parameter -f in Sub(Unter)-Shells übernommen werden. Beachten Sie, dass Funktionen und Variablen mit den selben Namen zur Mehrfach -Indentifikation in der entsprechenden Subshell führen kann. Hier ist Umsicht geboten, da es zu Problemen führen kann.
Funktionen können rekursiv verwendet werden. Die rekursiven Aufrufe sind unbegrenzt.
Parameter: Eigene Parameter bestimmen.
Ein Parameter ist eine Entität die Werte enthält. Es kann ein Name, eine Nummer oder eines der nachfolgenden speziellen Zeichen sein. Eine Variable ist ein Parameter, die durch einen Namen gekennzeichnet ist. Eine Variable hat einen Wert und null oder mehr Eigenschaften. Diese Eigenschaften werden durch das interne Kommando declare gesetzt.
Ein Parameter wird gesetzt, wenn ihm ein Wert zugewiesen wurde. Eine leere Zeichenfolge ist ein gültiger Wert. Wurde eine Variable gesetzt, kann sie nur durch das interne Kommando unset wieder geleert werden.
Ein Variable kann auf folgende Weise gesetzt werden:
name=[Wert-Inhalt]
Wird kein Wert angeben, wird der Variablen eine leere Zeichenfolge zugewiesen. Alle Werte unterliegen Erweiterung/Übergabe von der Tilde, Parameter- und Variablenübergaben, Kommandoübergaben, arithmetischen Übergaben und den Notierungsarten (im Verlauf näher beschrieben). Wurde die Variableneigenschaft integer gesetzt, wird ihr Wert als arithmetischer Ausdruck behandelt, selbst wenn die eigentlich Notierung für diese Art von Variablen $((...)) nicht benutzt wurde (siehe Arithmetische Ausdrücke). Worttrennung wird nicht unterstützt, mit der Ausnahme von $@, wie nachfolgend beschrieben. Dateinamenübergabe wird ebenfalls nicht unterstüzt. Angaben zur Zuweisung können in folgenden internen Kommandos enthalten sein: alias, declare, typeset, export, readonly, und local.
Der Operator += kann, in diesem Zusammenhang, genutzt werden um einer Variablen oder einem Datenbereichszähler (siehe Datenbereiche) einen Wert anzuhängen, bzw. zu addieren. Wurde die Eigenschaft integer gesetzt, wird der Wert als arithmetischer Ausdruck behandelt, dem vorhandenem Wert hinzugefügt, welcher ebenfalls als arithmetischer Ausdruck behandelt wird. Wird er auf einen Datenbereich, mittels zusammengesetzter Zuweisung (siehe Datenbereiche), angewendet, wird der Wert der Variablen nicht zurückgesetzt, wie durch den Operator =, sondern neue Werte dem Datenbereich hinzugefügt, dem Bereichszähler um eins erhöhend beginnend. Wird er auf Wert angewendet, die eine Zeichenfolge enthält, wird der Wert übergeben und dem Wert der Variablen angehängt.
Positionale Parameter
Ein positionaler Parameter ist gekennzeichnet durch eine, oder andere Ziffern als Null 0. Sie werden durch BASH zugewiesen, wenn Argumente aufgerufen werden und können durch das interne Kommando set verändert werden. Der Wert eines solchen Parameters (hier N genannt), kann durch ${N} referenziert werden, oder mit $N, wenn der Wert N eine einzelne Ziffer ist. Ihnen dürfen keine Beschreibungen zugewiesen werden. Die internen Kommandos set und unset lassen Ihre manipulation zu. Positonale Parameter werden temporär ausgetauscht, für die Ausführung einer Funktion. Wird ein positionaler Parameter, bestehend aus mehr als einer Ziffer übergeben, muss er mit Klammern umschlossen werden.
Spezielle Parameter
BASH behandelt einige Parameter gesondert. Diese Parameter können abgerufen, aber Ihnen kann kein Wert zugewiesen werden.
* Der sechsstrahlige Stern (auch Asterisk bezeichnet)
Hiermit werden die positionalen Parameter, beginnend mit Eins, übergeben.
Wird diese Übergabe in doppelte Anführungszeichen eingeschlossen, wird eine Zeichenkette bestehend aus den verschiedenen Werten der Parameter, getrennt durch das erste Zeiche der internen Variable $IFS (internal field seperator-interner Feldtrenner).
So ist $* äquivalent zu $1Z$2Z$3Z usw., Z steht als Platzhalter für das erste Zeichen des Wertes der internen Feldvariablen.
Ist das Trennzeichen nicht gesetzt, weden die Parameter durch ein Leerzeichen getrennt.
Ist IFS leer, wird kein Trennzeichen verwendet und die Werte werden einfach aneinander gehängt.
@ Der Klammeraffe (umgangssprachlich, engl. at, lat. ad)
Er übergibt die positionalen Paramter beginnend mit Eins.
In doppelten Anführungszeichen wird jeder Paramter als seperater Wert übergeben.
So wird aus $@, $1 $2 $3 $4 usw.
Tauchen doppelte Anführungszeichen in einem Wert auf, wird die Übergabe des ersten Parameters dem orginären Wert hinzugefügt und analog bei der Übergabe des letzten Parameters.
Wurden keine positionalen Parameter angegeben, über gibt das Zeichen nichts.
# Das Rautenzeichen
Gibt die Anzahl positionaler Paramter als Dezimalzahl aus.
? Das Fragezeichen
Enthält den Rückgabewert der letzten benutzten Vordergrundweiterleitung.
- Der Bindestrich
Enthält die, mit Hilfe des internen Kommandos set, angegeben Parameter die beim Aufruf eines Kommandos gesetzt wurden oder Parameter, die direkt angegeben wurden. Beispiel: ls -i
$ Das Dollarzeichen
Enthält die Prozess-ID (PID) der aktuellen Shell. In einer () Subshell übernimmt es die PID des aufrufenden Shellprozesses, <b>nicht zur PID der Subshell!
! Das Ausrufezeichen
Wird zur Prozess-ID (pid), des zuletzt ausgeführten Hintergrundkommandos (asynchron).
0 Die Null
Übernimmt den Namen des Skriptes oder der Shell. Er wird während der initialisierung der Shell gesetzt.
Wurde die Shell aus einem Skript aufgerufen, enthält $0 den Dateinamen, wurde die Shell mit dem optionalen Parameter -c aufgerufen (siehe BASH aufrufen), entspricht $0 dem ersten Argument, falls eines angegeben wurde.
Andernfalls, wird $0 durch den Dateinamen gesetzt der als Argument angegeben wurde um die Shell aufzurufen.
_ Der Unterstrich
Enthält das letzte Ergebnis, des zuletzt ausgeführten Kommandos.
Nach der Erstellung einer neuen Shell, enthält er den Verzeichniszweig, der zum Aufrufen der Shell genutzt wurde oder den Namen des Skriptes, bzw. der damit verbundenen Argumente, welches die Shell öffnete. Anschließend übernimmt er das letzte Argument, des zuletzt ausgeführten Kommandos.
Enthält auch Verzeichniszweige die beim Aufrufen der Datei, in der Shellumgebung für das Kommando genutzt werden.
Werden Nachrichten geprüft, enthält er den Namen der Nachrichtendatei.
Lernskript zum Experimentieren mit positionalen Parametern.
Übergaben: Übergabe von Zeichenfolgen
Übergaben werden durchgeführt, nachdem eine Kommandozeile eingelesen wurde und in relevante Teilstücke zerlegt wurde. BASH bietet sieben grundlegende Übergabemöglichkeiten.
Übergabearten nach Priorität sortiert:
- Übergaben durch geschweifte Klammern
- Übergaben der Tilde
- Übergaben von Parametern und Variablen
- Arithmetische Übergaben
- Übergaben von Kommandos
- Splittung von Zeichenfolgen in Werte
- Übergabe von Dateinamen
Auf manchen Systemen wird zusätzlich die Prozessübergabe unterstützt. Die Priorität gleicht der, der Übergaben 3-5.
1, 6 und 7 können die Anzahl der Zeichenfolgen verändern. Die übrigen Übergaben setzen die Zeichenfolgen eins zu eins um.
Als einzige Ausnahmen werden $@ und ${name[@]} (siehe Datenfelder) behandelt.
Wurden alle Übergaben bearbeitet, werden reservierte Zeichen extrahiert.
Übergabe von Ausdrücken in geschweiften Klammern
Diese Art der Übergabe erlaubt gewisse Freiheiten bezüglich der Begriffswahl. Sie ähnelt der Dateinamenübergabe, nur dass diese nicht existieren müssen. Solche Muster haben einen optionalen Charakter, in den Klammern werden Zeichenfolgen erwartet, die entweder durch Kommata getrennt werden oder einen Sequenzausdruck enthalten. Die Klammern können durch einen Präfix und einen Suffix eingeschlossen sein, oder eines von Beidem.
Die geschweiften Klammern können verschachtelt genutzt werden. Die Ergebnisse werden unsortiert, von links nach rechts behandelt.
Beispiel:
echo a{d,c,b}e
gibt folgende Zeichenfolgen aus:
ade ace abe
Eine Sequenz wird durch zwei Punkte erzeugt, die Zeichen müssen hier Ganzzahlen oder einzelne Zeichen sein.
echo a{a..z}e
echo a{1..100}e
Die Typen können nicht gemischt werden. Die Übergabe/Ausdruckserweiterung wird vor allen anderen Übergaben ausgeführt, spezielle Zeichen, die für andere Übergaben reserviert sind, bleiben erhalten. Die Übergabe wird rein textlich behandelt. BASH erwartet keinen syntaktischen Ausdruck zwischen den geschweiften Klammern und würde sie auch nicht verarbeiten. Um Konflikte mit der Parameterübergabe zu vermeiden, ist die Zeichenfolge ${ nicht verwertbar.
Eine korrekt formulierte Übergabe enthält eine nicht notierte öffnende, schließende und zumindest ein Komma oder einen gültigen Sequenzausdruck. Jede nicht korrekt formulierte Übergabe bleibt unberücksichtigt. { und , müssen durch einen Rückschrägstrich \ notiert werden, wenn Sie als Teil des Klammernausdruckes berücksichtigt werden sollen.
Folgendes Gerüst wird üblicherweise, kurzerhand benutzt, wenn der genutzte Präfix der Zeichenfolge länger ist als die gesamte, zu erstellende Zeichenfolge, wie die oberhalb beschriebenen Beispiele.
mkdir /usr/local/src/bash/{alt,neu,verteilung,fehler}
Legt vier Verzeichnisse im angegeben Verzeichniszweig an.
Oder:
chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}
Wie aus dem letzten, sehr komplexen Beispiel ersichtlich, sind Platzhalter zulässig. Gegensätzlich zum englischen Original dieses Handbuches, werde ich mir die Zeit nehmen und dieses Beispiel ausführlich erläutern, da es mir auf den ersten Blick, für einige Erstleser oder BASH-Neulinge, zu komplex erscheint.
chown root wechselt den Dateibesitzer und zwar werden die nachfolgenden Dateien in den Besitz des Benutzers root übergeben. Es handelt sich dabei um Dateien im Verzeichniszweig /usr/. Die geschweiften Klammern werden verschachtelt genutzt. Es befinden sich zwei weitere geschweifte Klammern in der Übergeordneten. Die jeweils öffnenden Klammern, wurden durch einen Rückschrägstrich \ ausnotiert: \{ Um als Klammerübergabe für BASH ersichtlich zu bleiben. Die Dateien ex und edit im Zweig /usr/ucb/, im Zweig /usr/lib/ alle Dateien beginnend mit ex, denen ein Zeichen vor dem Punkt und ein Zeichen nach dem Punkt folgt, deren restlichen Zeichen nicht von Bedeutung sind und die Datei how_ex wechseln den Besitzer.
Ein
echo /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}
im Terminal, kann das Verständnis unterstützen.
Tilde Übergaben
Beginnt eine zusammenhängende Zeichenfolge mit der Tilde, wird Sie unter dem Aspekt des Tilde-Präfix behandelt. Dies gilt bis zum ersten Schrägstrich /. Dieser Tilde-Ausdruck wird als möglicher Anmeldename angesehen. Bleibt die Stelle hinter der Tilde leer, nimmt die Tilde den Wert der Variable HOME ein, welche den Verzeichisnamen der ersten Ebene der Verzeichnisstruktur des Benutzers enthält.
[Angi@NDS ~]$ echo ~ /home/Angi
Wurde die Variable HOME nicht gesetzt, wird das Heimverzeichnis der ausführenden BASH-Instanz wiedergegeben. Normalerweise wird aber der Anmeldename mit dem dem Tilde-Ausdruck in Verbindung gebracht.
Ein Plus hinter Tilde ~+ ersetzt diese Zeichenfolge durch den Inhalt der Variablen PWD (Print Working Directory), also Zeige Arbeitsverzeichnis, es ist das aktuelle Verzeichnis. Ein
echo $pwd
kommt auf das gleiche Ergebnis wie das Kommando:
/bin/pwd
Durch Tilde-Minus ~- erhält die Zeichenfolge den Inhalt der Variablen OLDPWD (Old Print Working Directory) falls Sie schon gesetzt wurde, dies steht für das vorherige Arbeitsverzeichnis.
Folgt der Tilde eine vorzeichenbehaftete Zahl, versucht BASH den Ausdruck durch ein entsprechendes Elements des Verzeichnisverlaufs zu ersetzen. Dieses Verhalten gleicht dem des internen Kommandos dirs.
Ist der Anmeldename ungültig, schlägt die Tildenübergabe fehl und die Zeichenfolgen bleiben unberücksichtigt.
Jede Variablenzuweisung wird nach einem Doppelpunkt : oder Gleichheitszeichen = sofort geprüft. In dem Fall wird die Übergabe auch vollzogen. Als Konsequenz daraus, können Zuweisungen für die Variablen PATH, MAILPATH, und CDPATH Tilde-Ausdrücke enthalten und BASH übergibt den Inhalt.
Die folgende Übersicht zeigt die Behandlung von Zeichenfolgen denen eine Tilde voran gestellt ist:
~
Inhalt von $HOME
~/Bilder
$HOME/Bilder
~Karin/Dokumente
Zeigt das Unterverzeichnis Dokumente, der Benutzerin Karin
~+/Nachrichten
$PWD/Nachrichten, aktuelles Verzeichnis + dem gewählten Verzeichnis
~-/log
${OLDPWD-'~-'}/log ergibt das vorletzt besuchte Verzeichnis + dem angegeben log
~Zahl
Ergibt die gleiche Zeichenfolge wie dirs +Zahl
~+Zahl
Ergibt die gleiche Zeichenfolge wie dirs +Zahl
~-Zahl
Ergibt die gleiche Zeichenfolge wie dirs -Zahl
Parameter Erweiterung
Kommandoersetzung
Sie erlaubt das Ersetzen der ursprünglichen Kommandos durch die Ausgabe selbigens.
Kommandoersetzung erfolgt durch:
$(Kommando)
oder
`Kommando`
Gewöhnliche Zeilenumbrüche werden ignoriert. Erweiterte Zeilenumbrüche werden nicht gelöscht, aber könnten während der Splittung der Ausdrücke entfernt werden.
Die Kommandoersetzung
$(cat Datei)
kann durch das schnellere Äquivalent
$(< Datei)
ersetzt werden.
Wird die ältere Methode, die hochgestellten Rückschrägstriche, genutzt bleibt die Semantik vom Rückschrägstrich \ erhalten, es sei denn ihm folgt ein Dollarzeichen $, ein hochgestellter Rückschrägstrich ` oder der Rückschrägstrich \ selbst. Der erste hochgestellte Rückschrägstrich ` beendet die Kommandoersetzung.
Wenn die Form
$(Kommando)
genutzt wird, werden alle Zeichen in den Klammern als Kommando behandelt und kein Zeichen besonders behandelt.
Kommandoersetzung kann verschachtelt genutzt werden. Werden in den Verschachtelungen die `` genutzt, müssen die inneren hochgestellten Rückschrägstriche mit dem Rückschrägstrich \ ausnotiert werden. Wird die Ersetzung in Doppelte Anführungszeichen gesetzt, werden Zeichenketten-Splittung und Dateinamenerweiterung im Ergebnis nicht vollzogen.
Beispiel:
$ B=$(< .bashrc)
Befüllt die Variable B mit dem Inhalt der versteckten Datei .bashrc.
Ein
$ echo $B
gibt Inhalt ohne Zeilenumbrüche aus.
Arithmetische Erweiterung
Sie erlauben die Erzeugung arithmetischer Ausdrücke und die Ersetzung des Inhaltes durch das Ergebnis.
Die Syntax für arithmetische Erweiterungen lautet:
$(( Ausdruck ))
Der mathematische Ausdruck wird behandelt, als wäre er von Doppelten Anführungszeichen umschlossen, allerdings ohne Doppelte Anführungszeichen die darin enthalten sind besonders zu behandeln. Alle Zeichenfolgen mit besonderer Bedeutung werden der Parameter Erweiterung, der Kommandoersetzung und der Notierungsentfernung unterzogen. Arithmetische Ausdrücke können verschachtelt genutzt werden.
Die Ausdrücke können wie im Kapitel Arithmetik beschrieben erstellt werden. Ist ein Ausdruck ungültig, meldet BASH dies auf der Standard Fehlerausgabe und eine Ersetzung findet nicht statt.
Umleitungen: Steuerung der Ein- und Ausgaben.
Kommandos ausführen: Was passiert wenn ein Kommandos ausgeführt wird.
Umgebung
Endzustände
Signale
Skripte
Interne Kommandos
Variablen
Erweiterte Funktionen
Variablenfelder - Vektoren
BASH unterstützt eindimensionale Variablenfelder. Jede Variable kann als Feld genutzt werden. Das interne Kommando declare vereinbart ein Variablenfeld ausdrücklich. Eine Begrenzung des Feldes ist nicht vorgesehen, eine Indizierung ist nicht erforderlich und sie müssen nicht fortschreibend sein:
Variablenfelder sind NULL-basiert, d.h. die Nummer des ersten Elementes eines Feldes ist Null (0).
Ein Feld wird automatisch genutzt wenn folgender Syntax genutzt wird:
Variablenname[Feldnummer]=Wert
Die Feldnummer wird als rechnerischer Ausdruck behandelt und erfordert eine Zahl größer als minus Eins.
Für die ausdrückliche Vereinbarung eines Variablenfeldes wir folgender Syntax genutzt:
declare -a Feldvariablenname
Der Syntax
declare -a Feldvariablenname[Feldnummer]
ist ebenso gültig, allerdings wird die Feldnummer ignoriert. Die Eigenschaften der Feldvariablen werden durch die internen Kommandos declare und readonly gesetzt. Jede Eigenschaft wird für alle Teile des Feldes gesetzt.
Den Feldern werden mehrere Werte wie folgt zugewiesen:
Feldvariablenname=(Wert_1 Wert_2 Wert_3 ... Wert_n)
Jeder Wert entspricht der Form [[Feldnummer]=]WERT. Wurde die optionale Feldnummer angeben, wird dieser dem Index zugewiesen. Wird er nicht angebenen wird der Index automatisch um Eins (1) erhöht. Die Indizierung beginnt bei Null (0). Diese Syntax wird auch durch declare entgegen genommen. Bestimmte Feldelemente können durch die Syntax
Feldvariablenname[Feldnummer]=Wert
zugewiesen werden.
Ein bestimmtes Element eines Datenfeldes kann durch
${Feldvariablenname[Feldnummer]}
angesprochen werden. Die geschweiften Klammern sind nötig um Konflikte mit BASH's Dateinamenerweiterung zu vermeiden. Wird der Stern (*) oder der Klammeraffe (@) als Feldnummer genutzt, sind alle Felder betroffen. Diese zwei besonderen Feldbezeichner unterscheiden sich nur, wenn sie in Doppelte Anführungszeichen (") gesetzt werden.
Der Stern (*) nutzt in Doppelten Anführungszeichen zur Feldtrennung das erste Zeichen der BASH-internen Variable $IFS (internal field seperator-interner Feldtrenner). Der Klammeraffe (@) gibt die Inhalte als getrennten Ausdruck aus, sind die Felder leer erfolgt keine Ausgabe.
Wird die Notierungsart der Doppelten Anführungszeichen in einem Ausdruck genutzt, wird der Inhalt nahtlos an die letzten Zeichen des Ausdrucks vor den Anführungszeichen gefügt und der letzte Feldinhalt ebenso an die Zeichen des Ausdrucks nach den Anführungszeichen. Dies betrifft auch @ und *.
Die Raute (#) in geschweiften Klammern {}
${#Feldvariablenname[Feldnummer]}
gibt die Länge des bestimmten Datenfeldes aus. Wird der Klammeraffe (@) oder die Raute (#) als Feldbezeichner in diesem Zusammenspiel genutzt, wird die Gesamtzahl der vorhandenen Elemente ausgegeben. Wir eine Feldvariable ohne eine bestimmtes Feldnummer angesprochen ist dies analog zur Referenzierung des Feldes Null (0).
Das interne Kommando unset wird benutzt um Variablenfelder zu löschen.
unset Variablenname[Feldnummer]
löscht ein bestimmtes Element. Im Umgang mit der Generierung von Dateinamen ist Umsicht geboten! Wird unset $Variablenname genutzt und handelt es sich hierbei um ein Datenfeld, wird das gesamte Feld gelöscht. Wird der Stern (*) oder der Klammeraffe (@) als $Feldnummer genutzt, wird ebenfalls das gesamte Datenfeld gelöscht.
Die internen Kommandos declare, local und readonly akzeptieren den Parameter -a für die Erstellung eines Feldes. Das interne Kommando read nimmt nach dem Parameter -a eine Liste von Argumenten aus der Standardeingabe als Datenfeld entgegen und kann diese bestimmten Feldelementen zuordnen. Set und declare stellen Feldvariablen so dar, dass sich auch wieder als Eingabe genutzt werden können.
Beispiele:
In einer interaktiven SHELL werden der Variablen Datenfeld vier Werte, zugeordnet:
$ Datenfeld=(a bb ccc dddd)
Das Programm echo wird aufgerufen und durch die Variablensyntax wird das dritte Feld
$ echo ${Datenfeld[2]}
in einer neuen Zeile ausgegeben:
$ ccc
Durch das Einsetzen der Raute (#) wird die Länge des Wertes des bestimmten Datenfeldes ausgegeben:
$ echo ${#Datenfeld[2]}
$ 3
Der Einsatz vom Stern (*) oder der Raute (#) gibt die Anzahl aller einzelnen Eelente aus:
$ echo ${#Datenfeld[*]}
$ 4
Es sind 4 Elemente: 1. a, 2. bb, 3. ccc, 4. dddd.
Wie bereits erwähnt, müssen die Felder nicht fortschreibend sein, sie dürfen gestreut werden:
#!/bin/bash
Datenfeld[0]=0
Datenfeld[1]=1
Datenfeld[2]=2
Datenfeld[25]="Ein Baum"
unset Datenfeld[2]
echo "${Datenfeld[*]}"
Das oben beschriebene Beispiel erzeugt folgende Ausgabe:
$ 0 1 Ein Baum
Dateinamen=(*)
Füllt die Feldvariable mit allen Dateinamen des aktuellen Verzeichnisses.
Eine Feldvariable kann auch anhand der Dateiendungen gefüllt werden. Die Ausdrücke:
Tondateien=(*.ogg)
oder
Filme=(*.mp4)
kann genutzt um eine Feldvariable mit allen auffindbaren Dateien, die diese Dateiendung besitzen, zu füllen.
Ein etwas komplexeres Beispiel zeigt, wie sich die Feldnummer in einer Schleife erhöhen lässt:
#!/bin/bash
Datenfeld[0]="BASH"
Datenfeld[1]="enthält"
Datenfeld[2]="Elemente"
Datenfeld[3]="ähnlich"
Datenfeld[4]="C"
A=0
while (( $A < ${#Datenfeld[@]} ))
do
echo "Datenfeld Nummer $A enthält ${Datenfeld[A++]}"
done
Die Variable A wird als Hilfe genutzt, die Null (0) wird ihr zugewiesen und durch das Doppelplus (++) in der Schleife erhöht. Die Doppelklammer (( )) erzwingt einen arithmetischen Ausdruck.
Auftragssteuerung
Kommandozeilenmanipulation
Die Kommandoverlaufsfunktion
BASH's Betriebsbereitschaft herstellen
=Anhänge=
