-
I n h a l t s v e r z e i c h n i s
-
Es gibt unterschiedliche Versionen der bash Shell je nach Betriebssystemen und Leitlinien der Administratoren bzw. der Paketmanager. Dementsprechend gibt es Kommandos, um die Version zu identifizieren, welche auf dem eigenen System
printf "\n%s\n\n" $BASH_VERSION
Beispielsweise 3.2.57(1)-release.
bash --version
Eine Subshell wird startet, liefert die Antwort und endet: Beispielsweise
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin16)
Copyright (C) 2007 Free Software Foundation, Inc.
set | egrep -i version
Unter anderen Variablen (welche die Zeichenkette version enthalten) wird Variable BASH_VERSION angezeigt: Beispielsweise BASH_VERSION='3.2.57(1)-release'
-
Das Verhalten einer (bash-)Shell kann über Variablen bzw. Optionen gesteuert werden, die auf unterschiedliche Weise generiert bzw. gesetzt werden und daher auch unterschiedlich zugreifbar sind. Im Folgenden werden Aspekte dieses Themenkomplexes behandelt.
-
-
Shell-Variablen können vordefiniert oder nachträglich vom User gesetzt werden:
-
Vordefinierte Variablen werden offensichtlich dazu verwendet, das Verhalten der Shell zu steuern: Sie gehören der Shell-Umgebung.
-
Der User kann (viele) vordefinierte Umgebungsvariablen ändern und zudem mit Hilfe des Zuweisungsbefehls eigene definieren: Die Gesamtmenge aller definierten Variablen stellt die aktuelle Shell-Umgebung dar, die sowohl interaktiv (direkt über die Kommandozeile), als auch indirekt über Konfigurationsdateien und User-Skripts angepasst wird.
Eine Zuweisung ist lokal gültig. Sie wird erst mit Hilfe des export-Befehls den Sub-Shells übertragen. -
Es ist möglich, Umgebungsvariablen als nur-lesbar zu deklarieren.
-
-
Befehl Erläuterung / Beispiel =
Syntax: NAME=valueZuweisungsbefehl
If Variable NAME ist vordefiniert, der Befehl setzt ihren neuen Wert value.
If Variable NAME existierte bisher nicht, dann wird sie definiert und auf value gesetzt.
Beispiel: HISTFILESIZE=1000
HISTFILE ist vordefiniert und bezeichnet die maximale Zahl der Befehle, die in der History-Datei gespeicherte werden. In den meisten Systemen ist der vordefinierte Wert konservativ i.d.R. 500. Der User darf den Ressourcenverbrauch erhöhen.
Anm.:- Der Wert value muss unmittelbar nach dem =-Zeichen eingegeben werden: keine Leerstelle dazwischen.
- value kann leer sein: Die Variable NAME ist angelegt, aber ohne zugewiesenen Wert.
-
Definition und Wertzuweisung einer Variablen gilt nur, solange der Shellprozess 'lebt':
- Im interaktiven Modus gilt sie eben nicht für Vorfahren- oder Nachfahren- prozesse (sogenannte parent-shells oder sub-shells).
- Skripts sowie 'die meisten externen Kommandos' werden (im Gegensatz zu 'builtin-Kommandos') im eigenen Shell-Prozess (einer 'sub-shell') durchgeführt. Daher erlöscht eine im Skript durchgeführte Variablenzuweisung , wenn das Skript endet.
export
Syntax: export NAMEDas Schlüsselwort export bewirkt, dass die Gültigkeit der Zuweisung den Shellprozess überdauert - sich auf alle seine Vorfahren- und (potentiellen) Nachfahren- shells erschreckt.
Beispiel: export HISTFILESIZE (Der neue Wert von HISTFILESIZE gilt für alle Vorfahren- und Nachfahren- Shells.)Anm.: Die Kombination Zuweisung + Export in einem Befehl ist möglich: export HISTFILESIZE=1000
declare
Syntax: declare {-options} {NAME}Das bash-interne (builtin) Kommando ermöglicht es, Variablen mit Attributen zu versehen: Es ist eine schwache Form der Variablentypisierung, wie in anderen Programmiersprachen auffindbar. Die Optionen bestimmen den 'Variablentyp'.
Option Bedeutung declare -r NAME readonly
Der Wert der Variablen NAME kann nicht überschrieben werden.declare -a NAME Die Variable NAME wird als Feld (array) behandelt.
declare -F Ohne Argument werden die Namen aller definierten Funktionen aufgelistet.
Ist die Option kleingeschrieben, -f anstatt -F, wird zusätzlich den Funktionsrumpf aufgezeigt.
Will man den Quelltext einer einzelnen Funktion aufzeigen, schreibt man:
declare -f FUNKTIONSNAMEdeclare -x NAME Die Variable NAME wird exportiert.
declare -i NAME Die Variable NAME wird als integer deklariert.
Sollte die Variable NAME falsch zugewiesen werden, z.B. NAME=Ulanbator, gibt bash keinen Fehler aus, sondern 'konvertiert' stillschweigend den Wert: In diesem Fall ergäbe sich NAME=0.Anm.: Es ist möglich Deklaration und Zuweisung zu kombinieren, beispielsweise declare -x NAME=value.
Weitere Quellen:
-
Ein Kommentar zu Optionen wird beispielsweise von
Mendel Cooper besprochen.
-
Die trockene Beschreibung des Kommandos kann der
gnu-Seite entnommen werden.
unset
Syntax: unset -v NAMEVariable NAME wird 'gelöscht'.
Beispiel: unset -v MY_VARIABLE
Anm.:
- Nach dem Löschen ist NAME zunächst in keiner Nachfahrenshell verfügbar. Variablen NAME in Vorfahrenshells bleiben aber davon unberührt.
- Ein User sollte nur eigene Variable löschen. Wichtige Systemvariablen sind geschützt (Schreib- und Lösch- Zugriff sind verwehrt).
- Anstelle von Argument -v (für Variable) ist das Argument -f (für Funktion) verfügbar: Eine definierte Funktion wird entfernt.
env, printenv
Syntax: env
Syntax: printenvAlle exportierten (Umgebungs-)Variablen werden aufgelistet.
Beispiel: env | egrep -i khelil zeigt alle Umgebungsvariablen, welche die Zeichenkette khelil (ohne Rücksicht auf Groß- und Kleinschreibung) enthalten.Anm.: Da env bzw. printenv 'externe' Befehle (z.B. /usr/bin/env bzw. usr/bin/printenv), können sie nur Variablen zeigen, welche die Shell selber ausgibt: Lokale Variablen der Shell gehören aber nicht dazu.
set Syntax: set
Alle Variablen, die dem laufenden Shell-Prozess bekannt sind, werden aufgelistet.
Beispiel: set | egrep -i khelil zeigt alle Shell-Variablen, welche die Zeichenkette khelil (ohne Rücksicht auf Groß- und Kleinschreibung) enthalten.Anm.: Erwartungsgemäß zeigt builtin-Kommando set mehr Variablen als das externe Kommando env.
Anmerkungen:
-
Mehrere Befehle können auf einer Zeile eingegeben werden. Sie sollen mit einem Semikolon (;) getrennt werden.
Beispiel: HISTFILESIZE=1000 ; export
-
Beispiele von vordefinierten Variablen
Variablenname Bedeutung SHELL Die aktive Shell (z.B. /bin/bash) LOGNAME (Login-)Name des Users HOME Das Userverzeichnis (z.B. /Users/$LOGNAME) PATH Verzeichnisse, die abgesucht werden, wenn der User den Namen eines Programms oder eines externen Shell-Befehls eintippt. PWD Aktuelles Arbeitsverzeichnis (Print Working Directory). Anm.: Es wird gelegentlich zwischen vordefinierten Variablen aus der (Vorgänger-)
sh-Shell und bash-spezifischen Variablen unterscheiden.
- Links zu
Bourne Shell Variablen
- Links zu
bash spezifischen Variablen
- Links zu
-
-
Es gibt eine zweite Kategorie von vordefinierten Variablen, die das Verhalten der bash-Shell steuert. In der bash-Terminologie werden diese Variablen Optionen genannt. Optionen können entweder gesetzt (on) oder nicht-gesetzt (off) sein. Um Optionen an bzw. aus zu schalten, sind spezifische Kommandos vorgesehen:
Befehl Erläuterung/Beispiel shopt {-pqsu} {o} {optname} Um Optionen anzuzeigen sind folgende Möglichkeiten verfügbar: shopt zeigt alle Optionen. shopt -s zeigt alle gesetzten (aktivierten) Optionen. shopt -u zeigt alle nicht-gesetzten Optionen (nicht-aktivierten) Optionen. shopt -o zeigt die Optionen, die über das builtin-Kommando set -o handhabbar sind. Um Option optname zu aktivieren (to set): shopt -s optname
Um Option optname zu deaktivieren (to unset): shopt -u optnameset -o {optname} Das builtin-Kommando set ist vielfältig. Nur die Option -o ist hier von Interesse, welche die Shell-Optionen betrifft.
- Ohne Argument listet das Kommando all Optionen samt der Einstellung (on/off).
- Mit Argument Optname wird die entsprechende Option gesetzt.
-
-
-
Im interaktiven Modus gibt der User seine Befehl via Kommandozeile. Ich bezeichne diese Kommunikation mit der Shell als unmittelbar, im Gegensatz zur Datenverarbeitung über
der Vermittlung von Skripts - siehe Kapitel
(Bash) Skripts programmieren
-
Dieses Kapitel wird getrennt behandelt - siehe Beschreibung von Kommandos anhand von Beispielen
-
Verkettung von Kommandos mittels pipelines
Die "Verkettung" in diesem Zusammenhang entspricht den Englischen Begriffen "command piping" oder "pipelines".
Darunter wird eine Reihe von Kommandos command_1-..-command_n verstanden, die von links nach rechts (1 bis n) bearbeitet werden und wofür gilt, dass die Ausgabe des vorherigen Kommandos zugleich Eingabe des nachfolgenden Kommandos ist.Die komplette bash syntax dazu ist: [ time [ -p ]] [ ! ] command_1 [ [ | ⎪ |& ] command_2 ... ]
Meistens ist nur ein Teil der Syntax nötig, um die Sequenz command_1-command_2-..., wie erwünscht, durchzuführen : command_1 [ | command_2 ... ] Beispiele:
-
shopt | grep -E -i prog
zeigt alle shell-Optionen, welche die Zeichenkette "prog" beinhalten. Dabei unterscheidet der Suchalgorithmus (grep -i) nicht zwischen Groß- und Kleinbuchstaben (D.h. z.B., dass Ketten "Prog" oder "PROG" zum Suchmuster gehören). -
env | grep -E -i LC
zeigt alle shell-Umgebungsvariablen, welche die Zeichenkette "LC" beinhalten.
Für weitere Infos siehe auch folgende Links:
-
-
Verkettung von Kommandos mittels lists
Die Verkettung in diesem Zusammenhang entspricht dem Englischen Begriff list.
Z.B. werden zwei Kommandos command_1-command_2 aneinandergereiht. Ob command_2 durchgeführt wird, hängt vom Ausgangsstatus der Bearbeitung von command_1. Dabei werden zwei Verknüpfungen in Betracht gezogen.-
Bei der UND-Verknüpfung command_1 && command_2 wird command_2 wird nur dann durchgeführt, wenn command_1 erfolgreich war (d.h. Exit-Status von command_1 gleich 0)
-
Bei der ODER-Verknüpfung command_1 || command_2 wird Command_2 nur dann durchgeführt, wenn command_2 gescheitert ist (d.h. Exit-Status von command_1 ungleich 0)
In beiden Fällen ist der Exit-Status der Liste gleich dem Exit-Status des zuletzt durchgeführten Kommandos.
Es ist möglich Kommandos zu gruppieren. Dafür stehen zwei Konstrukte zur Verfügung:
-
SYNTAX { Kommando-Gruppe ; }
Die Liste von Kommandos wird in der aktuellen Shell-Umgebung abgearbeitet. Sie muss mit einem getrennten Semikolon ( ;) abgeschlossen werden. -
SYNTAX ( Kommando-Gruppe )
Die Liste von Kommandos wird in einer Subshell abgearbeitet. Jede Änderung der Shell-Umgebung während der Bearbeitung geht nach Erhalt des exit-Status verloren.
Für weitere Infos siehe auch folgende Links:
-
-
Umleitung von Kommandos (redirection)
Um den Begriff Umleitung zu verstehen, sollte man sich die Ausführung eines Kommandos wie einen Vorgang vorstellen, der einen Datenstrom verarbeitet. Woher bekommt ein Kommando Informationen (Eingabedaten-Strom)? Wohin werden die Ergebnisse gezeigt, gespeichert (Ausgabedaten-Strom)? Unix/Linux Betriebssysteme betrachten zudem Fehler als einen eigenständigen Fehlerdaten-Strom.
Das System legt beim Hochfahren fest, was was ist. Der User bekommt aber die Möglichkeit, je nach Bedarf, Datenströme neu zu definieren: die Umleitung. Weitere Informationen dazu können z.B. der detaillierten Beschreibung vom Kommando exec entnommen werden - der u.a. dazu verwendet wird, um Daten umzuleiten.
Weitere Information entnehmen Sie z.B. folgenden Quellen:
-
Die oben aufgeführten Beispiele von Kommandos stellen ein unvollständiges Protokoll der eigenen Erfahrung dar.
Je nach Bedarf und Verfügbarkeit werde ich weitere Kommandos hinzufügen. Ich muss aber nicht das Rad neu erfinden: Auf dem Internet gibt es auch eine Viezahl von Einführungen zu Kommandos der (wiedergeborenen) bash Shell zugänglich. Hier einige Empfehlungen.Nr. Autor(en) Jahr Sprache Information / Beschreibung (Titel) Link 01 Lane Schwartz 2019 Englisch 19 Kommandos erläutert:
{cal date pwd exit history mkdir ls less rm cd mv ln echo cat uniq wc grep head tail}09 Begriffe erklärt:
{Wildcard expansion, pathname expansion, arithmetic expansion, brace expansion, parameter expansion, command substitution, escape characters, double quotes, single quotes}.YouTube: Linux Command Line
-
-
-
Grundlagen der bash Skriptsprache
-
-
Alle Programmiersprachen deklinieren auf ähnliche Weise grundlegende Regeln: die bash Skriptsprache bildet keine Ausnahme.
Die Ausführungen unten setzen einige Vertrautheit mit diesen Regeln voraus, u.a. ein prinzipielles Verständnis dessen, was ein Quelltext ist, wie er strukturiert ist (u.a. solche Begriffe wie Variablen, Anweisungen, Konstrukte, Operatoren, etc.), wie es durchgeführt wird (u.a. das Fortschreiten des Programmzeiger usw.).Insbesondere werden folgende Begriffe nicht näher definiert - weil solches Erläutern den anvisierten Rahmen deutlich sprengen würde.
- Was eine Variable ist. Numerisch oder Zeichenkette. Und wie sie - zusammen mit anderen - manipuliert werden kann: arithmetische und alphanumerische Operationen, etc.
- Was Entscheidungspunkte entlang des Durchführungspfads eines Programms sind bzw. wie der Berechnungsvorgang prinzipiell gesteuert wird.
- Was Dateien sind und wie sie in Quelltexten prinzipiell verwaltet werden.
Leser, die z.B. mit der Programmiersprache C vertraut sind, können auf Anhieb komplexere bash Skripts entwickeln, da eine gewisse Ähnlichkeit der Syntax unübersehbar ist (und möglicherweise beabsichtigt ist).
In der folgenden Tabelle werden einige (wichtige) Sprachkonstrukte aufgelistet und knapp beschrieben. Im nächsten Kapitel wird in den zum Herunterladen bereitgestellten Beispielskripts aufzeigt, wie sie eingesetzt werden können, um bestimmte Aufgaben zu erledigen.
-
Anmerkungen zur Syntax bei der Darstellung der Konstrukte:
- Die bash reservierten Worte (reserved words) werden fett dargestellt.
- Die runden Klammer () fassen Kodezeilen zusammen. Diese Zeilen können bezeichnet werden - z.B (Bedingungen) -, oder auch nicht weiter bezeichnet werden - () - (aber nicht leer!).
- Die eckigen Klammern [] fassen optionale Teile des Konstruktes. Ein Verschachteln der optionalen Teile ist möglich.
-
-
Ob im interaktiven Modus (siehe auch Shell-Variablen) oder innerhalb eines Skripts, ermöglicht es bash, Variablen zu deklarieren und sogar teilweise (ihren Typ) zu definieren. Die im Skript deklarierten Variablen sind außerhalb des Skripts unbekannt wie auch auf der Kommandozeile deklarierte Variablen nur in der laufenden Shell bekannt sind. Um diese Einschränkung zu überwinden, muss eine Variable exportiert werden. Beispielsweise mit dem Befehl export ${VariablenName}. Im letzteren Fall wird die Variable Teil der Umgebung und kann z.B. via den Befehl printenv aufgelistet werden. Mehr Infos dazu über die Hilfe-Option --help der Befehle export, printenv.
Beispiele:# Deklaration einer Zeichenkette. Keine explizite Typ-Definition möglich.
My_Name='A. Khelil'
# Ausgabe der Variable zeigt A. Khelil an
echo $My_Name
# Deklaration einer Ganzzahl. Die Typ-Definition (via Schlüsselwort declare -i) ist nicht erforderlich
declare -i My_Preferred_Number
My_Preferred_Number='29'
# Ausgabe der Variable zeigt 29 an
echo $My_Preferred_Number
# Deklaration einer Gleitkommazahl als Konstante (via Schlüsselwort readonly). Versuche den Wert zu ändern scheitern
readonly Feigenbaum_Constant=4.669201
# Ausgabe der Konstante zeigt 4.669201 an
echo $Feigenbaum_Constant
# Deklaration eines Arrays (eines indizierten Feldes) ist. Die Typ-definition (via Schlüsselwort declare -a) ist nicht erforderlich
declare -a my_data=(data_1 data_2 data_3)
# Ausgabe des Arrays zeigt data1_ data_2 data_3 an
echo ${my_dat[@]}
- Um mehr zur Syntax und zu den Optionen von declare zu erfahren, kann man declare --help auf der Kommandozeile eintippen.
Über die Variablensubstitution ist es möglich, die Ausgabe eines Befehls direkt in eine Variable zu speichern. Sehr praktisch.
# Das Speichern der Username
Username=$(whoami)
# Das Speichern des laufenden Verzeichnisses
Current_Dir=$(pwd)
# Das Speichern von Datum und Zeit zu einem bestimmten Zeitpunktes
Current_Date=$(date)
-
Übersicht der Konstrukte Nr. 1- Konstrukt
2- Erläuterung
3- Beispiele von Skripts01 -
(Kodezeilen vor dem Konstrukt)
if (Bedingungen_1)
then
(führe_Kodezeilen_1_durch)
[...
elif (Bedingungen_k)
then
(führe_Kodezeilen_k_durch)
...]
else
(führe_Kodezeilen_zuletzt_durch)
fi
(Kodezeilen nach dem Konstrukt) -
-
Das if () then () [[elif () then ()] else () ] fi Konstrukt.
Bedingungen k (von 1 n) werden nacheinander geprüft. Die erst gültige Bedingung Bedingungen_k verursacht die Durchführung von Kode führe_Kodezeilen_k_durch. Dann springt der Programmzeiger auf (Kodezeilen nach dem Konstrukt) . Ist keine der Bedingungen 1 bis n gültig, dann wird Kode führe_Kodezeilen_zuletzt_durch durchgeführt. -
Auch nur partielle Teile des Konstrukts können kodiert werden.
Die Teile elif () then () und das abschließende else () sind optional. Die kürzeste Form des Konstruktes ist also if () then () fi.
-
-
Siehe z.B. folgende Skripts:
- Die test Skripts: bash_test.sh, bash_test_extended.sh bash_test_others.sh
02 -
(Kodezeilen vor dem Konstrukt)
case EXPRESSION
MUSTER_1)
(führe_Statements_1_durch)
;;
[...
MUSTER_k)
(führe_Statements_k_durch)
...]
*)
(führe_Statements_zuletzt_durch)
;;
esac (Kodezeilen nach dem Konstrukt) -
Die Datenverarbeitung läuft ähnlich wie für If-Then-Else. Diese zusätzliche Syntax soll nur unter bestimmten Umständen die Lesbarkeit des Quelltextes erhöhen. Auch in der Sprache C wird ein verwandtes Konstrukt namens switch verwendet. Ein großer Unterschied zwischen beiden ist, dass bash das case Konstrukt verlässt, sobald ein gültiger Muster (MUSTER_k) gefunden wurde und die zugeordneten Kodezeilen (führe_Statements_k_durch) durchgeführt wurden. (C wurde das Konstrukt weiter untersuchen, auf der Such nach weiteren gültigen Mustern.
Jedes Muster (MUSTER_k) kann "reguläre Ausdrucke" beinhalten, die bash dazu veranlassen, spezielle Erkennungsalgorithmen durchzuführen - siehe auch
gnu Handbook: Pattern Matching.
-
Siehe z.B. folgende Skripts:
03 -
(Kodezeilen vor dem Konstrukt)
while [ AUSDRUCK-BEDINGUNGEN ]
do
(führe_Statements_durch)
done (Kodezeilen nach dem Konstrukt) -
Auch die Programmiersprache C kennt ein while Konstrukt mit gleicher Bedeutung. (Anstatt den reservierten Worten do-done bedient sich die Programmiersprache C zur Abgrenzung der bedingten Kodezeilen geschweiften Klammern {}).
Weitere Infos entnehmen Sie z.B. folgenden Unterlagen
-
Siehe auch folgende Skripts:
-
Skript: bash_statement_case.sh Referenz in der Tab. der Skripts Ref. Skript case -
Skript: bash_statement_while_1.sh Referenz in der Tab. der Skripts Ref. Skript while-1 -
Skript: bash_statement_while_2_readwriteFile.sh Referenz in der Tab. der Skripts Ref. Skript while-2
-
-
-
Übersicht Beispiele von read and print Daten in Bash sind dem Skript bash_read_printf.sh zu entnehmen.
Nr. 1-Konstrukt 2-Erläuterung 3-Beispiele von Skripts 01 -
Beispiel:
read -t 5 -p "Bitte eine Ganzzahl eintragen" EineZahl
printf "Sie haben folgende Zahl eingetippt %i" "$EineZahl"
Erläuterung:
Der User wird aufgefordert eine Zahl einzutragen, die in Variable EineZahl gespeichert wird.
Die Variable "EineZahl" wird im nächsten Schritte auf die Konsole ausgegeben (Verifikation-Schritt).
Anmerkungen:
- Falls der User nicht innerhalb von 5 Sekunden antwortet, wird der Vorgang mit einem Zeitüberschreitung-Fehler (Time-out) abgebrochen. Man kann also diesen Befehl dazu verwenden, um die Durchführung des Skripts eine Weile zu unterbrechen ( read -t 5 -p "Ich mache 5 Sekunden Pause").
Für weitere Infos siehe z.B.
Online Manpage (Englisch) https://ss64.com/bash/read.html Manpage auf der Konsole (Englisch) help read 5 Anwendungsbeispiele (Englisch) https://linuxhint.com/use-read-command-bash/ Leitfaden für Anfänger (Deutsch) https://wiki.ubuntuusers.de/Shell/Bash-Skripting-Guide_f%C3%BCr_Anf%C3%A4nger/#Interaktion-mit-dem-Benutzer
02 -
Beispiel: siehe read
Erläuterung:
Wegen der erweiterten Formatierungsmöglichkeiten ziehe ich Befehl printf der verbreiteten Alternative echo vor.
Die Syntax von printf ist der des gleichnamigen C-Schlüsselwortes entlehnt. Im Beispiel oben wird das Schlüsselwort %i genutzt, um eine Ganzzahl (Integer) anzuzeigen. Andere Schlüsselworte sind u.a. %f (floating number), %e bzw. %E (floating number in exponential notation), %g bzw. %G (floating number in exponential or normal notation depending on what is more appropriate), %s (string).Für weitere Infos siehe z.B.
Online Manpage (Englisch) https://ss64.com/bash/printf.html Manpage auf der Konsole (Englisch)
help printf (Anm.: Auf meinem Linux System ist die Beschreibung nicht sehr ergiebig) Bash printf command
https://linuxize.com/post/bash-printf-command/ Leitfaden für Anfänger (Deutsch) https://wiki.ubuntuusers.de/Shell/Bash-Skripting-Guide_f%C3%BCr_Anf%C3%A4nger/#Interaktion-mit-dem-Benutzer
-
-
-
In diesem Kapitel werden rudimentäre Skripts veröffentlicht, die von der eigenen Erfahrung oder von Quellen aus dem Internet inspiriert wurden. Jedes enthält Code-Auszüge zur Lösung einer oder mehrerer Fragestellungen, die möglichst im Skript selbst kommentiert werden.
-
Übersicht der Skripts
-
Thema Daten eingeben oder ausgeben Skript bash_read_printf.sh -
Thema Analyse, Auswertung der "Eingangsparameter" eines Skriptes Skript bash_List_params.sh -
Thema Das Programmieren von Menüs mit der bash Anweisung select Skript bash_cmd_select.sh -
Thema Die sogenannte bash shell expansion Skript bash_expansions.sh -
Thema Das Prüfen von Bedingungen anhand der Funktion test bzw. [ (nur noch wegen der Rückwärtskompabilität unterstützt) Skript bash_test.sh -
Thema Das Prüfen von Bedingungen anhand der erweiterten test-Funktion [[ (wird für neue Skripts empfohlen) Skript bash_test_extended.sh -
Thema Das Prüfen von arithmetischen Bedingungen anhand des Konstrukts (( Skript bash_test_others.sh -
Thema Das Prüfen von Optionen anhand der bash Anweisung case Skript bash_statement_case.sh -
Thema Bearbeitungsschleife bis eine Bedingung erfüllt wird - anhand der bash Konstrukte until und if-then-else Skript bash_statement_until_if_patmach.sh -
Thema Mehrere Verfahren, um bash (numerische) Variablen zu inkrementieren Skript bash_increment_var.sh -
Thema Verwendung der while Schleife Skripts bash_statement_while_1.sh
bash_statement_while_2_readwriteFile.sh
-
-
Beschreibung der einzelnen Skripts
Nr. 1- Begriff / Befehl; 2- Skriptname (Download Link); 3- getestet auf 01 -
Abfrage und Ausgabe einer Variable. Folgende Alternativen werden berücksichtigt: Die Variable ist eine Ganzzahl, ein Gleitkommawert, eine Zeichenkette, ein Passwort.
- Beispiel: bash_read_printf.sh
- Getestet auf Linux
02 -
Auswertung von Skript-Argumenten (i.e. Optionen, welche beim Aufruf des Skriptes mit eingetragen werden, um sein Verhalten zu steuern)
- Beispiel: bash_List_params.sh
- Getestet auf OSX
03 -
Das Programmieren von Menüs mit der bash Anweisung select
- Beispiel: bash_cmd_select.sh
- Getestet auf OSX, Linux
04 -
bash Shell "Expansion" von Variablen, Kommandos, arithmetischen Ausdrücken: mit Hilfe der Tags ${ }, $( ), $(( )). Auch werden folgende Zeichen herangezogen: \ (Expansions-Deaktivierung), | (Kommando-Verkettung)
- Beispiel: bash_expansions.sh
- Getestet auf Linux
05 -
Builtin Funktion test wird über die [ Anweisung aufgerufen.
Um EineBedingung zu testen, wird folgendes geschrieben: [ EineBedingung ]. Das Argument des test Befehls (d.h. der Ausdruck innerhalb der eckigen Klammern) entspricht einer Bedingung, deren Wahrheitsgehalt geprüft werden soll: Das Ergebnis der Auswertung ist entweder TRUE oder FALSE. (Anm.: Beachte die Leerstelle zwischen den Klammern und dem umklammerten Inhalt, damit bash das Konstrukt überhaupt erkennen kann).
-
Jede Bedingung setzt sich aus einem Operator (op) und einem oder zwei Argumenten (arg, arg1, arg2) zusammen. Folgender Syntax entsprechend: [ op Arg ] oder [ Arg1 op Arg2 ]
-
Einzelne Bedingungen innerhalb der eckigen Klammer [] können - je nach Operator - sich auf numerische Größen, auf Zeichenketten oder auf Dateien beziehen.
-
Argumente selbst bestehen aus "Worten", deren Werte sich unmittelbar ergibt (Konstanten), oder aus sogenannten Expansionen ermittelt werden: Variablen-Expansionen, Arithmetische Expansionen, usw.
Es ist wichtig zu verstehen, dass innerhalb des test Befehls (bzw. innerhalb der eckigen Klammern []) eine Syntax gilt, die sich von der allgemeinen bash Syntax unterscheidet.
Zuletzt können einzelne test Bedingungen anhand folgender Operatoren kombiniert werden:- (unärer) Operator Negation z.B. ! [ EineBedingung ]
- (binärer) Operator UND z.B. [ Bedingung1 ] && [ Bedingung2 ]
- (binärer) Operator ODER z.B. [ Bedingung1 ] || [ Bedingung2 ]
Anm.: Letztere Operatoren gehören zur allgemeinen Shell Syntax: innerhalb der eckigen Klammer [], wird dagegen eine UND-Verknüpfung mit dem Operator -a und eine ODER-Verknüpfung mit dem Operator -o kodiert. Dieser Programmierstil scheint eher veraltet und nicht empfohlen.
Weitere Erläuterungen zur Syntax der eingebauten test Funktion sind z.B. folgenden Unterlagen zu entnehmen
-
- Beispiel: bash_test.sh
- Getestet auf Linux
06 -
Die erweiterte test Funktion wird über die [[ Anweisung (das doppelte Rechteck) aufgerufen.
Im Gegensatz zu [ (der builtin test Fuktion, dem einfachen Rechteck), wird sie direkt von bash interpretiert. Für neue Skripts wird die erweiterte Funktion empfohlen, da besser lesbar, als die ältere. Die Syntax sieht also so aus: [[ eineBedingung ]]. (Anm.: Beachte die Leerstelle zwischen den doppelten Klammern und dem umklammerten Inhalt, damit bash das Konstrukt überhaupt erkennen kann).
-
Folgende Datenmanipulationen sind erlaubt:
Tilde Expansion, Parameter- & Variablen- Expansion, Arithmetische Expansion, Kommando- & Process- Substitution, und "quote removal". -
Folgende Datenmanipulationen sind nicht erlaubt:
Word-splitting, Dateiname- Expansion
- In Funktion "Compare_to_Pattern" des vorbereiteten Skripts wird demonstriert, wie man mit (in einer Variablen gespeicherten) regular expressions arbeiten kann.
-
-
Beispiel bash_test_extended.sh zeigt Ex-1) Mustererkennung von Strings, Ex-2) Prüfung des Dateistatus
- Getestet auf Linux
07 -
Eine weitere syntaktische Möglichkeit Bedingungen zu prüfen (ob TRUE oder FALSE) besteht über die Evaluierung eines arithmetischen Ausdrucks (( Expression )). In arithmetischen Ausdrücken sind folgende bash Operatoren zulässig:
Operator(en) Definition id++ id-- variable post-increment and post-decrement ++id --id variable pre-increment and pre-decrement - + unary minus and plus ! ~ logical and bitwise negation ** exponentiation * / % multiplication, division, remainder + - addition, subtraction << >> left and right bitwise shifts <= >= < > comparison == != equality and inequality & bitwise AND ^ bitwise exclusive OR | bitwise OR && logical AND || logical OR expr ? expr : expr conditional operator = *= /= %= += -= <<= >>= &= ^= |= assignment expr1 , expr2 comma Siehe auch folgende Quellen zu arithmetischen Ausdrücken in bash
- Beispiel: bash_test_others.sh
- Getestet auf Linux
08 -
Bedingte Datenverarbeitung mit Anweisung case
Weitere Erläuterungen zur Syntax entnehmen Sie bitte folgenden Quellen
- Beispiel: bash_statement_case.sh
- Getestet auf OSX, Linux
09 -
Bedingte Datenbearbeitung mit Konstrukten (until and if-then-else) und zusätzlicher Anwendung der Mustererkennung (pattern matching)
- Beispiel: bash_statement_until_if_patmach.sh
- Getestet auf OSX, Linux
10 -
Variablen inkrementieren
Insbesondere Zähler werden oft benötigt, um Iterationen zu steuern - z.B. eine Schleife zu beenden. bash setzt mehrere Vorgehensweise zu Verfügung, um das Gleiche zu erreichen.Weitere Informationen entnehmen Sie bitte z.B. den folgenden Quellen:
- Beispiel: bash_increment_var.sh
- Getestet auf Linux
11 -
Verwendung der while Schleife, um einen iterativen Prozess zu steuern - siehe Beschreibung von Konstrukt while.
-
Beispiele:
- Getestet auf Linux
-
-
Weitere Quellen mit Beispielen von Skripts
Nr. Autor(en) Jahr Sprache Thema (Titel) Link 01 Sasikala 2010 Englisch bash Conditional Expression Examples (-e, -eq, -z, !=, [, [[..)
bash Conditional Expressions
02 Fahmida Yesmin 2019 Englisch bash Conditional Statement
bash Conditional Statement
-
Übersicht der Skripts
-
Nr. Autor(en) Jahr Sprache (Titel) Link 01 Fahmida Yesmin 2019 Englisch 02 Tutorialkart
2018 Englisch
-
Grundlagen der bash Skriptsprache
-
Weitere Quellen zu bash Handbüchern / Hilfe
In den Kapiteln unten werden bestimmte Aspekte der bash Shell behandelt. Vieles bleibt unerwähnt. Um einen vollständigen Überblick zu ermöglichen, fasst die folgende Tabelle sehenswerte Links zu bash Handbüchern.
Nr. Autor(en) Sprache (Titel) Link 01 TU-Chemnitz
Deutsch 02 gnu software foundation
Englisch 03 ComputerHope
Englisch