U n i x    S h e l l    bash

  1. bash Konfiguration

    I n h a l t s v e r z e i c h n i s

    1. bash Identifizierung

      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'

      Befehle zur Abfrage der aktiven bash-Version

    2. bash Umgebung

      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.

      1. Shell-Variablen

        1. Möglichkeiten der Gestaltung

          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.

        2. Variablen editieren

          Befehl Erläuterung / Beispiel
          =
          Syntax: NAME=value

          Zuweisungsbefehl
          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 NAME

          Das 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 FUNKTIONSNAME

          declare -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.

          Optionen des bash-bultin-Kommandos declare

          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 NAME

          Variable 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: printenv

          Alle 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.

          Befehle zur Gestaltung der Shell-Umgebung (environment variables)

          Anmerkungen:

          • Mehrere Befehle können auf einer Zeile eingegeben werden. Sie sollen mit einem Semikolon (;) getrennt werden.
            Beispiel: HISTFILESIZE=1000 ; export

        3. 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).
          Beispiele von Umgebungsvariablen

          Anm.: Es wird gelegentlich zwischen vordefinierten Variablen aus der (Vorgänger-) sh-Shell und bash-spezifischen Variablen unterscheiden.

      2. Shell Optionen

        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:

        shoptzeigt 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 optname

        set -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.

        Kommandos zur Handhabung der Shell-Optionen

  2. Interaktiver Modus

    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
    1. Kommandos und Beispiele

      Dieses Kapitel wird getrennt behandelt - siehe Beschreibung von Kommandos anhand von Beispielen

    2. 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:

    3. 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:

      1. SYNTAX { Kommando-Gruppe ; }
        Die Liste von Kommandos wird in der aktuellen Shell-Umgebung abgearbeitet. Sie muss mit einem getrennten Semikolon ( ;) abgeschlossen werden.
      2. 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:

    4. 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:

    5. Tutorials

      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
      Liste von Tutorials zu bash Befehlen

  3. Skripts programmieren

    1. Grundlagen der bash Skriptsprache
      1. Wichtige Hinweise

        1. 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.

        2. 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.

      2. Variablen (Substitution)

        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[@]}
        Beispiele von User definierten Variablen in Skripts oder auf der Kommandozeile

        • 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)

        Beispiele von User definierten Variablen

      3. Konstrukte der Skriptsprache

        Übersicht der Konstrukte

        Nr. 1- Konstrukt
        2- Erläuterung
        3- Beispiele von Skripts
        01
        1. Konstrukt: "If-Then_Else"

          (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.

        2. Siehe z.B. folgende Skripts:

        02
        1. Konstrukt: "case"

          (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)

        2. 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.

        3. Siehe z.B. folgende Skripts:

        03
        1. Konstrukt: "while" (Schleife)

          (Kodezeilen vor dem Konstrukt)
          while [ AUSDRUCK-BEDINGUNGEN ]
          do
            (führe_Statements_durch)
          done
          (Kodezeilen nach dem Konstrukt)

        2. 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

        3. Siehe auch folgende Skripts:

          1. Skript: bash_statement_case.sh
            Referenz in der Tab. der Skripts Ref. Skript case

          2. Skript: bash_statement_while_1.sh
            Referenz in der Tab. der Skripts Ref. Skript while-1

          3. Skript: bash_statement_while_2_readwriteFile.sh
            Referenz in der Tab. der Skripts Ref. Skript while-2

        Liste von grundlegenden Konstrukten in bash Skripts

      4. Input Output

        Übersicht
        1. read data (von der Konsole)
        2. print data (in die Konsole, Display)

        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
        1. [Input] "read"

          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
        1. Output: "printf"

          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

    2. Beispiele von bash Skripts

      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.

      1. Übersicht der Skripts
        1. Thema Daten eingeben oder ausgeben
          Skript bash_read_printf.sh

        2. Thema Analyse, Auswertung der "Eingangsparameter" eines Skriptes
          Skript bash_List_params.sh

        3. Thema Das Programmieren von Menüs mit der bash Anweisung select
          Skript bash_cmd_select.sh

        4. Thema Die sogenannte bash shell expansion
          Skript bash_expansions.sh

        5. 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

        6. Thema Das Prüfen von Bedingungen anhand der erweiterten test-Funktion [[ (wird für neue Skripts empfohlen)
          Skript bash_test_extended.sh

        7. Thema Das Prüfen von arithmetischen Bedingungen anhand des Konstrukts ((
          Skript bash_test_others.sh

        8. Thema Das Prüfen von Optionen anhand der bash Anweisung case
          Skript bash_statement_case.sh

        9. Thema Bearbeitungsschleife bis eine Bedingung erfüllt wird - anhand der bash Konstrukte until und if-then-else
          Skript bash_statement_until_if_patmach.sh

        10. Thema Mehrere Verfahren, um bash (numerische) Variablen zu inkrementieren
          Skript bash_increment_var.sh

        11. Thema Verwendung der while Schleife
          Skripts bash_statement_while_1.sh
          bash_statement_while_2_readwriteFile.sh

      2. Beschreibung der einzelnen Skripts

        Nr. 1- Begriff / Befehl; 2- Skriptname (Download Link); 3- getestet auf
        01
        1. Abfrage und Ausgabe einer Variable. Folgende Alternativen werden berücksichtigt: Die Variable ist eine Ganzzahl, ein Gleitkommawert, eine Zeichenkette, ein Passwort.

        2. Beispiel: bash_read_printf.sh
        3. Getestet auf Linux
        02
        1. Auswertung von Skript-Argumenten (i.e. Optionen, welche beim Aufruf des Skriptes mit eingetragen werden, um sein Verhalten zu steuern)

        2. Beispiel: bash_List_params.sh
        3. Getestet auf OSX
        03
        1. Das Programmieren von Menüs mit der bash Anweisung select

        2. Beispiel: bash_cmd_select.sh
        3. Getestet auf OSX, Linux
        04
        1. bash Shell "Expansion" von Variablen, Kommandos, arithmetischen Ausdrücken: mit Hilfe der Tags ${ }, $( ), $(( )). Auch werden folgende Zeichen herangezogen: \ (Expansions-Deaktivierung), | (Kommando-Verkettung)

        2. Beispiel: bash_expansions.sh
        3. Getestet auf Linux
        05
        1. 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

        2. Beispiel: bash_test.sh
        3. Getestet auf Linux
        06
        1. 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

          1. In Funktion "Compare_to_Pattern" des vorbereiteten Skripts wird demonstriert, wie man mit (in einer Variablen gespeicherten) regular expressions arbeiten kann.

        2. Beispiel bash_test_extended.sh zeigt Ex-1) Mustererkennung von Strings, Ex-2) Prüfung des Dateistatus

        3. Getestet auf Linux
        07
        1. 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
          bash arithmetische Operatoren, nach abnehmender Präzedenz aufgelistet

          Siehe auch folgende Quellen zu arithmetischen Ausdrücken in bash

        2. Beispiel: bash_test_others.sh
        3. Getestet auf Linux
        08
        1. Bedingte Datenverarbeitung mit Anweisung case

          Weitere Erläuterungen zur Syntax entnehmen Sie bitte folgenden Quellen

        2. Beispiel: bash_statement_case.sh
        3. Getestet auf OSX, Linux
        09
        1. Bedingte Datenbearbeitung mit Konstrukten (until and if-then-else) und zusätzlicher Anwendung der Mustererkennung (pattern matching)

        2. Beispiel: bash_statement_until_if_patmach.sh
        3. Getestet auf OSX, Linux
        10
        1. 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:

        2. Beispiel: bash_increment_var.sh
        3. Getestet auf Linux
        11
        1. Verwendung der while Schleife, um einen iterativen Prozess zu steuern - siehe Beschreibung von Konstrukt while.

        2. Beispiele:

        3. Getestet auf Linux
        Beispiele von bash-Skripts

      3. 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

        Weitere Inspirationsquellen aus dem Internet (mit Beispielen von Quelltexten)

    3. Tutorials zu "bash scripting"

      Nr. Autor(en) Jahr Sprache (Titel) Link
      01 Fahmida Yesmin 2019 Englisch

      YouTube:bash Scripting Full Course 3 Hours

      02 Tutorialkart 2018 Englisch

      bash Scripting Tutorial

      Liste von empfohlenen Tutorials
  4. 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

    gnu bash Handbuch

    02 gnu software foundation Englisch

    gnu bash Manual

    03 ComputerHope Englisch

    The bash Shell

    bash-Shell Überblick