Grundlegende Tools und Methoden für den alltäglichen Gebrauch

Dies ist nunmehr der zweite Teil unserer Serie Linux für Einsteiger.

Im ersten Teil haben wir uns mit grundlegenden Funktionen wie Zugang per SSH, Ordnernavigation, gängigen Befehlen und ganz grundlegenden Skripten befasst.

Dieses Mal wollen wir uns etwas eingehender mit Skripten befassen. Wie immer gilt, wenn Ihr Ergänzungen habt die ihr gerne mit der Welt teilen wollt, lasst es uns wissen und wir fügen Sie dem Artikel hinzu.

Dieser Artikel erklärt auch grundlegende Themen. Ihr könnte also ruhig Abschnitte überspringen, mit denen ihr bereits vertraut seid.

Skripte 101

Beim letzten Mal haben wir einen verketteten Befehl in ein Skript verpackt um uns die Tipperei, besonders falls man mal mit dem Handy nachts auf dem System rumspringt, zu ersparen.

Das wollen wir jetzt in mehreren Schritten noch verfeinern und unserem Skript etwas mehr Finesse verleihen, auf das es uns bessere Dienste tun kann.

Argumente

Eingangsvariablen oder Argumente werden im Linux-Umfeld nach der Reihenfolge ihres Auftretens nummeriert. Das Erste Argument ist also $1 das Zweite $2 und so weiter.

Um uns das zu veranschaulichen bauen wir ein kleines Skript, welches uns unsere Argumente wieder zurück gibt.

Und führen dieses aus:

Die Schwäche dieser Art der Programmierung wird klar, wenn wir nicht genau 3 Argumente mitgeben

Eine gängige Methode, um sich dieses Problems zu entledigen ist shift. Dieser Befehl rotiert die Argumente durch. Bedeutet: $2 wird zu $1

Ein Beispiel

Das allein ist natürlich noch nicht wirklich hilfreich aber kombiniert mit einer While-Schleife können wir damit eine unbekannte Anzahl an Argumenten verarbeiten.

Die While-Schleife benötigt natürlich eine Prüfung, wann Sie enden darf. Dafür setzen wir den Begriff in [[ ]] um eine Prüfung zu beschreiben. Der Paramter -n prüft hier auf eine Stringlänge größer 0.

Es handelt sich bei [ um einen Befehl, weshalb er auch Argumente in Form von -n verarbeiten kann. Mit dem Befehl which können wir uns anzeigen lassen wo dieser liegt:

[ heißt eigentlich test und gehört zum Befehlssatz von POSIX und funktioniert in fast jeder Shell ist allerdings in seinem Funktionsumfang deutlich begrenzter als [[ was eine Bash Erweiterung ist und für unsere Zwecke etwas praktikabler. Wer sich trotzdem mit den Unterschieden befassen möchte findet hier eine entsprechende Dokumentation über Vor- und Nachteile der verschiedenen Implementationen.

Unser neues Skript ist nun also in der Lage beliebig viele Argumente zu verarbeiten oder auch keine.

An Schleifen und Prüfungen bietet BASH das kleine 1×1 der Programmiersprachen:

  • While
  • Until
  • For
  • If
  • Case

Wer schon mit anderen Programmiersprachen Erfahrungen gesammelt hat wird sich hier schnell zurechtfinden.

Hier ein paar Beispiele für die jeweiligen Schleifen und Prüfungen

Until

For

If

Case

Funktionen

Wie in anderen Sprachen auch können wir auch in Bash Funktionen definieren und diese aufrufen. Das können wir entweder mit nachgestellten () oder dem Stichwort function definieren und dann mit dem gewählten Funktionsnamen wieder aufrufen.

Einlesen wie man es kennt

Mit diesen Werkzeugen an der Hand können wir jetzt anfangen uns Argumente und Variablen einzulesen und darauf reagieren. Gute Form ist es, eine usage()-Funktion zu schreiben, die uns erklärt was wir hier überhaupt an Argumenten haben und wie wir diese verarbeiten können.

Wir nehmen unser Skript vom letzten Mal als Beispiel und wollen die Datei, die eingelesen wird, sowie die Menge der IPs variabel mitgeben und eine Funktion einführen um die IPs direkt sperren zu können.

Variablen

Variablen können wir in BASH einfach definieren in dem wir Ihnen einen Wert zuweisen. Für den anschließenden Aufruf müssen wir lediglich ein $ voranstellen.

Wir müssen der Variable auch keinen Typ zuweisen, das übernimmt Bash bereits für uns

Häufig werden Variablen die Ausgabe von anderen Befehlen zugewiesen. Dies können wir realisieren in dem wir um unseren Befehl eine Klammer mit $ setzen.

Ohne getopts

Wir nehmen unsere While-Schleife aus dem Beispiel und erweitern diese um ein Case das unsere Argumente durchgeht. Kennen wir ein Argument nicht, geben wir unsere Anleitung zurück.

Wie immer müssen wir unseren Nutzern etwas über die Schulter schauen, also prüfen wir die eingelesenen Variablen auf Sinn.

Und um uns das Leben mit dem Handy nachts leichter zu machen geben wir noch Standard-Werte mit. Damit sichern wir uns auch gegen fehlende Eingaben ab. Ein paar Kommentare fügen wir auch gleich ein, um dem Nächsten das Leben etwas leichter zu machen

Jetzt wo wir alle für uns wichtigen Variablen abgefragt und geprüft haben können wir mit der eigentlichen Funktion beginnen. Diese hat sich seit dem letzten Mal nicht wirklich verändert, sondern bekommt einfach unsere Variablen dazu

Um unsere Bannfunktion implementieren zu können müssen wir allerdings das Ergebnis in eine Variable überführen.

Da normalerweise Tail die Formatierung für uns übernimmt müssen wir das hier selbst machen. Eine Möglichkeit ist es eine Fallunterscheidung mit If einzubauen, welche abhängig vom Funktionsmodus unsere bisherige Lösung aufgreift oder die Formatierung anpasst und direkt zwecks Verbannung zu Iptables überführt.

Hinweis: Die Bannfunktion haben wir in diesem Fall für das Testsystem auskommentiert.

Mit getopts

Bash liefert uns ein weiteres Tool an die Hand zum Einlesen von Variablen, mit dem Namen getopts. Dieses nimmt uns das Weiterschieben der Variablen per shift ab, kann aber nichts mit langen Argumenten wie –input oder –count anfangen. Wir müssen unsere Implementierung also ein wenig anpassen.

Hinweis: die Syntax von getopts gestaltet sich so, dass jede Variable die von einem : gefolgt ist ein entsprechendes Argument hat. Zusätzlich gibt es eine eingebaute Fehlermeldung, wenn eine Option nicht gefunden wurde. Anbei ein Beispiel:

Darüber Hinaus verhält sich unser Skript auch mit getopts wie erwartet.

Fazit

Wir haben in diesem Artikel die Grundlagen für BASH-Skripte beleuchtet. Wir haben uns eigene Variablen geschaffen und diese mit Leben gefüllt, wir haben penibel überprüft, dass unsere User dort auch nur sinnvolle Eingaben machen. Wir haben eigene Unterfunktionen erstellt und haben die wichtigsten Schleifen und Prüfungen behandelt.

Ihr solltet nun in der Lage sein, grundlegende Bash-Skripte zu schreiben mit denen man einfache Aufgaben gut automatisieren kann.

Es sei gesagt, dass es wie in jeder Programmiersprache, viele Wege nach Rom gibt. Die hier vermittelten Methoden dienen in erste Linie dem möglichst nachvollziehbaren Lernen wie Skripte in der Bash funktionieren.

Mathias Feld

Mathias Feld

Senior System Engineer

Gefällt dir der Artikel? Bitte teile ihn!
Share on Facebook
Facebook
0Share on LinkedIn
Linkedin
Email this to someone
email
Tweet about this on Twitter
Twitter