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.