Einführung in die Bash Programmierung


Die Bash

Bash ist die Abkürzung für Bourne again shell") und verfügt über sehr viele komplexe Funktionen um Leistungsfähige Skripte zu erstellen. Die Bash ist voll kompatibel zur originalen Bourne Shell (sh), jedoch mit erheblich erweitertem Funktionsumfang. Auf den meisten Unix-Systemen ist Bash die Standard-Shell, daher auch dieses kleine Tutorial.

Weiß der Programmierer diese Leistungsfähigkeit richtig einzusetzen, benötigt er kaum noch externe Programme bzw. Skriptsprachen wie z.B (Ptython, PHP, C/C++) um tägliche Arbeiten zu erledigen.

Der Anfang

Beginnen wir mit einem Standard-Script welches für fast jedes Tutorial benutzt wird. Das "Hallo Welt" Script :)

#!/bin/bash
echo "Hallo Welt"


In der ersten Zeile steht hinter den Zeichen #! der Name des Interpreters. Hier sollte nicht, wie es häufig zu sehen ist, /bin/sh eingetragen werden, weil dies je nach System nur ein symbolischer Link ist, der auch auf einen anderen Interpreter zeigen kann.

Der Rest des Scripts besteht im einfachsten Fall aus einer Reihe von Befehlen die nacheinander abgearbeitet werden - genau so, wie du es an der Kommandozeile eingeben würdest. Dabei wartet die Bash bis der derzeitige Befehl komplett ausgeführt wurde und macht dann mit dem nächsten weiter. Eine Ausnahme gibt es. Folgt dem Befehl ein "&" kaufmännisches Und wird er als Hintergrundprozess gestartet und die nächste Zeile des Scripts wird abgearbeitet.

Somit lassen sich z.B Daemons starten. Das aufgerufene Programm läuft also parallel zum Mutterprozess.

Zurück zum Hallo Welt Script. In diesem vereinfachten Beispiel wird einfach nur Hallo Welt auf der Console ausgegeben. Dafür verantworlich ist der befehl echo.

Variablen

Die Benutzung von Variablen ist für Einsteigen sicherlich etwas verwirrend. So muss z.B das Dollarzeichen immer dann vor den Variablennamen geschrieben werden, wenn der Inhalt der Variable ausgegeben werden soll. Will man allerdings einer Variable einen Wert zuweisen so darf das Dollarzeichen nicht verwendet werden.

#!/bin/bash
VAR1="Hallo"
VAR2="Welt"
echo "$VAR1 $VAR2"


Dieses Beispiel gibt wieder nur Hallo Welt auf der Console aus. In den Zeilen 2 und 3 werden den beiden Variablen VAR1 und VAR2 werte zugewiesen, also KEIN Dollarzeichen. In Zeile 4 hingegen sagen wir dem Interpreter das wir nicht VAR1 und VAR2 ausgeben wollen sondern deren Variableninhalte.

Es gibt eine weitere Schreibweise für die Ausgabe von Variablen, die man eigentlich bevorzugen sollte. nicht $VAR1 und $VAR2, sondern ${VAR1} und ${VAR2} .. Das folgende Beispiel zeigt warum.

#!/bin/bash
Hallo="Hello"
Welt="World"
HalloWelt="$Hallo $Welt"
echo "$HalloWelt"


Was soll die Bash an dieser Stelle ausgeben? Den Inhalt der Variablen Hallo und die Buchstaben Welt? Den Inhalt der Variablen HalloWelt?

Ohne jeden zweifel würde mit folgendem Beispiel keinerlei Verwirrung auftreten

#!/bin/bash
Hallo="Hello"
Welt="World"
HalloWelt="$Hallo $Welt"
echo "${HalloWelt}"
echo "${Hallo}Welt"


Der erste echo befehl würde die Variable HalloWelt ausgeben und der zweite die Variable Hallo und das Wort Welt. Die Ausgabe wäre also

HelloWorld HelloWelt


Die Bash erkennt also anhand der Klammern wo eine Variable aufhört.

 

Variablen 2

Es gibt noch andere Möglichkeiten, Variablen Werte zuzuweisen. Eine davon ist das einlesen von Tastatureingaben an der Console.
Dazu folgendes Beispiel.

#!/bin/bash
echo "Wie ist dein Name?"
read Name
echo "Hallo $Name"


Der Befehl "read" wartet hierbei auf die eingabe an der Console (durch [Enter] abgeschlossen. Somit wird der Variable "Name" ein Wert zugewiesen der durch "echo" an das Wort Hallo angehangen wird.

Eine weite Möglichkeit ist die Parameterübergabe. Dazu legen wir einmal eine Datei "test.sh" mit folgendem Inhalt an.

#!/bin/bash
echo "Hallo $1"


Rufen wir die Datei nun mit

./test.sh Chris


auf, gibt dieses Script "Hallo Chris" zurück. "$1" ist also der erste an das Script übergebene Parameter.

 

Leerzeichen

Man sollte stets Zeichenketten in Anführungszeichen setzen.
Das Leerzeichen ist für die Bash ein Trenner zwischen Parametern.

#!/bin/bash
$HalloWelt=${Hallo} ${Welt}
$HalloWelt="${Hallo} ${Welt}"


Der Unterschied im obigen Codebeispiel liegt zweifelsfrei an den Anführungszeichen. So mancher fragt sich bestimmt wo der Unterschied liegt. In beiden Zeilen stehen 3 Leerzeichen zwischen den Variablen. Bei der ersten Zeile trennt in der Ausgabe jedoch nur ein Leerzeichen die Zusammengesetzte Zeichenkette, da die Bash Leerzeichen als Trenner ansieht.


Schliesst man einen String jedoch mit Anführungszeichen ein, signalisiert man der Bash das es sich um ein zusammengesetztes Konstrukt handelt, also nur eine Zeichenkette.


Das gleiche gilt für die Ausgabe von Text mit echo. Geben wir die Variable $HalloWelt ohne Anführungszeichen aus, expandiert die Bash den Aufruf zu

echo Hello World


und somit bekommt der Befehl echo zwei parameter übergeben "Hello" und "World" Die Ausgabe auf der Console würde somit nur ein Leerzeichen enthalten.



Kontrollstrukturen

Die Kontrollstruktur "if" hat wohl jeder der Scriptet oder Programmiert schon einmal gesehen. Sie ähnelt sich in fast jeder Programmiersprache und überprüft ob eine Bedingung erfüllt wird, und führt abhängig vom Ergebnis weitere Befehle aus. Das folgende Beispiel überprüft ob die datei /home/chris/datei.sh existiert.

#!/bin/bash
if [ -e /home/chris/datei.sh ]; then
echo "Datei gefunden"
else
echo "Datei nicht gefunden
fi


Die Kontrollstruktur erwartet hinter dem Schlüsselwort "if" einen ausführbaren Befehl. Im Beispiel

[ -e /home/chris/datei.sh]


Die eckige Klammer ist nur eine andere schreibweise für den Befehl "test".

if test -e


Würde das gleiche bewirken. Existiert die angegebene Datei, signalisiert die Bash dieses mit dem Rückgabewert "0". Hier gibt es einen unterschied zu anderen Programmiersprachen. Meistens gilt:

0 = FALSE
1 = TRUE


In der Bash ist dies genau andersherum. Der Wert 0 gilt stets als Wahr. Existiert die angegebene Datei gibt die Bash die Consolenausgabe Datei gefunden zurück.. Ansonsten Datei nicht gefunden.

Klingt logisch oder?

 

Schleifen

Das wohl wichtigste Schleifenkonstrukt ist "for" das in der Bash gleich zwei Verwendungsformen kennt.

#!/bin/bash
for (( i=1; ${i}<=10; i++)); do
echo ${i}
done

Wer eine Programmiersprache beherrscht, kann mit diesem Beispiel bestimmt etwas anfangen.
Für alle anderen eine kurze Erläuterung.

Die Variable "i" wird mit dem Wert "1" initialisiert.
Solange "i" kleiner oder gleich 10 ist läuft die Schleife weiter. "i++" bedeutet das "i" bei jedem
Schleifendurchlauf um 1 erhöht wird.
Somit gibt die Bash jede Zahl von 1-10 einmal an der Console aus.

Eine weitere Verwendungsform von Schleifen ist die Verarbeitung von Listen.
Dazu mal folgendes Beispiel

#!/bin/bash
for d in `ls -l /etc`; do
echo ${d}
done


Hinter dem Schlüsselwort "for" steht eine Variable der ein Wert zugewiesen werden soll. (Also kein Dollarzeichen)
Hinter "in" finden wir die Liste, welche die Schleife durchlaufen soll. Diese Liste kann auch ein durch Leerzeichen, Tabulatoren oder Zeilenumbrüche getrennter String sein.

Unser Beispiel nutzt die Ausgabe des Befehls " ls -l /etc " um die Schleife mit Werten zu füttern. Dabei nutzen wir umgedrehte Hochkommas (auch Backticks genannt) Diese werden gerne mal mit " oder ' verwechselt.
Für unsere zwecke benötigen wir [SHIFT][´]

Als Ergebnis liefert uns das Beispiel eine Liste aller Dateien und Verzeichnissen, die sich in "/etc" befinden. Jeder Schleifendurchlauf bewirkt das die Variable "d" einen neuen Wert zugewiesen bekommt und durch "echo" ausgegeben wird.

 

to be continued.....