Hallo,
heute möchte ich euch gerne einen kleinen Crash-Kurs zum Thema "Shell-Programmierung" im speziellen zur "Bash" geben. Ihr werdet hier erfahren und lernen, was die Bash überhaupt ist, was man damit alles anstellen kann und vorallem wie man überhaupt ein Shell-Programm erstellt/programmiert.
Inhaltsverzeichnis
- Shell-Programmierung - Was bedeutet das?
- Bash - Was ist das?
- Warum Bash und nicht "Sh"?
- Hinweise / Tipps & Tricks zur Shell-Programmierung
- Beispiel Programmierung
Gut, dann fangen wir mal von vorne an.
-
Shell-Programmierung - Was bedeutet das?
Unter Linux/Unix gibt es mehrere verschiedene Shells, wie zum Beispiel die sh, bash, dash, zsh und ksh. Alle Shells unterscheiden sich prinzipiell nur in den vorhandenen Funktionen, dem Speicherplatzverbrauch auf der Festplatte und der Herkunft. So kann die sh beispielsweise weniger als die bash und die zsh wiederum kann mehr als die sh und bash.sh, zsh und ksh kann man übrigens wie folgt aussprechen, um nicht immer so abgehakte Wörter sagen zu müssen: shell, zshell, kshell
Je nach Shell kann man also verschiedene Befehle und Funktionen der Shell nutzen. Wie PHP, Python und VBA zählt auch die Shell-Programmierung zum Oberbegriff "Skript". Die Shell-Programmierung wird hauptsächlich zur Automatisierung oder Vereinfachung von Prozessen benutzt. So kann man Beispielsweise ein kleines Shell-Skript schreiben, dass die Webserver Logs auswertet und entsprechend ausgibt. Ein weiteres Beispiel wäre zum Beispiel die Automatisierung von Backups.
So... Und je nachdem welche Shell man eben für das Skript verwendet, heißt das entsprechend "Bash-Skript" bzw. "Bash-Programmierung" oder z.B. "KSH-Skript" bzw. "KSH-Programmierung". Wem die Namen jedoch nicht gefallen, kann es auch einfach bei dem Namen "Shell-Programmierung" bzw. "Shell-Skript" belassen.
-
Bash - Was ist das?
Wie eben erklärt, gibt es unter Linux/Unix mehrere verschiedene Shells mit mehr oder weniger Funktionen - die Bash ist so eine Shell. Die Bash ist eine Shell, die auf der sh basiert und einige nützliche Funktionen der ksh und csh implementiert, also benutzt. -
Warum Bash und nicht "Sh"?
Die bash deckt meiner Meinung nach die meist genutzten Funktionen, die gebraucht werden, ab und dadurch hat man weniger bzw. keine Probleme mit "unbekannter Befehl".
-
Hinweise / Tipps & Tricks zur Shell-Programmierung
Vom Prinzip ist die Shell-Programmierung ganz einfach. Man muss hierfür nur folgende Punkte beachten:-
Shell-Skripte enden normalerweise mit der Extension/Datei-Endung "sh", wie "shell"
Beispiel: skript.sh
Aufbau: <DATEINAME>.sh
- In die aller erste Zeile muss der Shebang rein (siehe auch hier: Shebang (Unix) - Wikipedia, the free encyclopedia)
Sieht für die "bash" zum Beispiel so aus: #!/bin/bash
Aufbau: #!<PFAD_ZUR_SHELL>
-
Variablen werden ohne führendes Dollar-Zeichen definiert
Beispiel: TEXT="Hallo Welt!"
Aufbau: <VARIABLEN_NAME>=<WERT>
Hinweis: Variablen können während des Skriptes wahllos und einfach vom Datentyp geändert werden, indem man einfach den Inhalt der Variable ändert:
TEXT="Hallo Welt!" (jetzt ist der Datentyp der Variable ein String)
TEXT=123 (jetzt ist der Datentyp der Variable ein Integer) -
Benutzung von Variablen erfolgen wie gewöhnt mit einem führenden Dollar-Zeichen
Beispiel: $TEXT
Aufbau: $<VARIABLEN_NAME> -
Befehle, die auf der Shell funktionieren, funktionieren auch im Shell-Skript
Beispiel: free -mt (gibt Auskunft über freien und genutzten RAM vom System)
Aufbau: <Shell_BEFEHL>
-
IF-Abfragen sind ähnlich aufgebaut wie in anderen Sprachen:
Beispiel: if [[ $(ping example.com -c1) ]]; then echo 'example.com ist erreichbar!'; else echo 'example.com ist NICHT erreichbar!'; fi
Aufbau: if [[ <ÜBERPRÜFUNG> ]]; then <WENN ERFOLGREICH TUE...> fi
Erklärung: "if" startet eine IF-Abfrage | "THEN" sagt "wenn erfolgreich, dann mache..." | "ELSE" sagt "wenn nicht erfolgreich, dann mache..." | "FI" beendet die IF-AbfrageDas Beispiel überprüft übrigens per PING, also ICMP-Paket, ob der Host "example.com" erreichbar ist und falls ja gibt es "example.com ist erreichbar!" aus - falls nicht "example.com ist NICHT erreichbar!".
- Sollte was nicht funktionieren gibt es mehrere Debug-Modes, die man in die zweite Zeile des Shell-Skriptes reinschreiben muss. Ich empfehle hier die ausführlichere Version: set -x
- Damit das Shell-Skript auch funktioniert, muss es nach dem Anlegen/Speichern auch ausführbar sein. Dazu kann man das "execute" Bit (= x) setzen: chmod +x skript.sh
-
Ausführen/Starten des Shell-Skriptes, wenn es ausführbar ist: ./skript.sh
-
Shell-Skripte enden normalerweise mit der Extension/Datei-Endung "sh", wie "shell"
-
Beispiel Programmierung
Als kleines Beispiel möchte ich hier zum Verständnis noch ein paar kleine Skripte zeigen:Beispiel 1)
Dateiinhalt: cat ./beispiel_skript.shBash#!/bin/bash# Dies ist eine Kommentarzeile# Und noch eine Kommentarzeile, die vom Skript ignoriert wird# PS: Kommentarzeilen mit einem Ausrufezeichen werden als Shebang angesehen und NICHT ignoriert! (also die erste Zeile z.B. ;))# Überprüfe, ob example.com erreichbar istDOMAIN="example.com"if [[ $(ping $DOMAIN -c1) ]]; then # Domain ist erreichbar :) echo "$DOMAIN ist erreichbar!";else # Domain ist nicht erreichbar :( echo "$DOMAIN ist NICHT erreichbar!";fi
Ausführbar machen:
Skript ausführen:
Zitat von Ausgabeexample.com ist erreichbar!
Beispiel 2)
Dateiinhalt: cat ./beispiel_skript.shBash#!/bin/bash# Rechnen wir etwas ;)# Man kann die Variablen schreiben wie man möchte: klein, groß, klein und groß# Werte einer Variable zuweisenWERT_1=5WERT_2=10WERT_3=20#Gebe die Werte nacheinander ausecho $WERT_1echo $WERT_2echo $WERT_3echo# Der Variable "SUMME" die Summe der Werte 1 und 2 zuweisenlet "SUMME = WERT_1 + WERT_2"echo "$WERT_1 + $WERT_2 = $SUMME"echo "Wert 3 = $WERT_3"let "Summe_Neu = $SUMME - $WERT_3"echo "$SUMME - $WERT_3 = $Summe_Neu"
Skript ausführen:
Zitat von Ausgabe5
10
205 + 10 = 15
Wert 3 = 20
15 - 20 = -5
Das war's dann auch schon wieder. Ich hoffe, ich konnte euch die Shell-Programmierung etwas näher bringen. Sollte es Fragen geben, könnt ihr diese gerne hier unten als Antwort/Kommentar erstellen.
Hier geht es zum nächsten Teil: [Bash-Programmierung] Umleitungen, grep und Co.