Erste Schritte mit Bash-Skripten

© Kirsty Pargeter, 123RF

Assistent

Das Programmieren von Shell-Skripten ist keine Hexerei. Schon mit wenigen Grundkenntnissen sparen Sie durch das Automatisieren alltäglicher Aufgaben viel Zeit.

README

Die Bourne-Again-Shell (Bash) hilft bei vielen kleinen und großen Aufgaben. Wenn Sie ein paar einfache Kniffe beherrschen und die richtigen Konstrukte kennen, sparen Sie viel Zeit und Mühe.

Shell-Skripte sind der beste Freund bequemer Menschen. Das mag seltsam klingen, denn das Schreiben eines Shell-Skripts setzt Können und Arbeit voraus, stimmt aber trotzdem: Schreiben Sie ein Shell-Skript zum Erledigen von sich wiederholenden Aufgaben, rentiert sich die investierte Zeit in der Zukunft mehrfach. Außerdem stellt das Schreiben eines Shell-Skripts eine Herausforderung dar, die viel Freude macht.

Dieser Artikel fasst die Grundlagen zum Schreiben von Shell-Skripten mit Bash im Kontext einiger allgemeiner Aufgaben zusammen. Dabei erhalten Sie die wichtigsten Informationen, um gleich mit dem Schreiben eigener Skripte zu beginnen. Eine kurze Zusammenfassung der behandelten Kommandos und Optionen finden Sie in der Tabelle "Schnellübersicht" am Ende des Artikels.

Hallo Bash!

In der einfachsten Form besteht ein Shell-Skript nur aus einer Datei mit einer Liste von auszuführenden Befehlen. Das folgende Skript führt beispielsweise einen langen Tar-Befehl aus, um ein Backup von Bilddateien zu erstellen:

#!/bin/bash
tar cvzf /save/pix.tgz /home/chavez/pix  /graphics/rdc /new/pix/rachel

Das Skript beginnt mit einer speziellen Zeile, die die Datei selbst als Skript identifiziert. Die Kombination #! heißt "Shebang", darauf folgt der vollständige Dateipfad zur entsprechenden Shell. Der Shebang #!/bin/bash ruft ausdrücklich die Bourne-Again-Shell zum Ausführen des Skripts auf. Verwenden Sie das allgemeinere #!/bin/sh, kommt die Standard-Shell des Systems zum Zug, auf die der Symlink /bin/sh verweist – unter Ubuntu ist das beispielsweise die schlanke, weitgehend zur Bash kompatible Dash. Sie können die Ausführung aber auch einem anderen Programm übertragen: Der Shebang #!/bin/cat etwa führt dazu, dass das entsprechende Programm den Inhalt des "Skripts" auf der Konsole ausgibt.

Damit die Shell das Skript als ausführbare Datei erkennt, setzen Sie zunächst die Ausführungsrechte entsprechend. Heißt die Datei zum Beispiel mytar, erledigen Sie das mit dem Befehl chmod u+x mytar – vorausgesetzt, die Datei liegt im aktuellen Verzeichnis.

Der Rest des Skripts nach dem Shebang besteht aus dem Tar-Befehl mit den zu verarbeitenden Pfaden und Dateinamen. Der folgende Befehl führt das Skript aus, worauf einige Meldungen von Tar folgen:

$ ./mytar

Damit haben Sie die Anzahl der Anschläge, die zum Erzeugen eines Archivs nötig sind, von etwa 75 Zeichen auf 8 Zeichen reduziert. Allerdings ließe sich das Skript noch etwas allgemeiner – und damit nützlicher – gestalten, indem Sie die zu archivierenden Dateien in der Kommandozeile angeben:

$ ./mytar /home/chavez /new/pix/rachel /jobs/proj5

Mit diesem Befehl archivieren Sie eine andere Gruppe von Dateien. Das modifizierte Skript sehen Sie in Listing 1.

Listing 1

 

#!/bin/bash
if [ $# -gt 0 ]; then  # mindestens ein Argument
  tar czf /save/mystuff.tgz $@ >/dev/null
fi

Es gibt darin einige neue Features: Der Tar-Befehl verwendet jetzt Ein- und Ausgabeumleitung, um alle Meldungen zu unterdrücken, die sich nicht auf Fehler beziehen. Der Befehl befindet sich innerhalb einer If-Anweisung. Erweist sich die in eckigen Klammern angegebene Bedingung als wahr, arbeitet das Skript die darauffolgenden Befehle ab.

Es prüft, ob die Anzahl der Argumente zum Skript, die Sie in der Variable $# finden, höher als 0 liegt: Falls ja, hat der Benutzer einen oder mehrere Pfade fürs Archivieren angegeben. Fehlen die Parameter, gibt es nichts zu tun, der Befehl kommt also nicht zum Einsatz.

Ein weiterer Vorteil: Das Skript übergibt die Argumente, die es auf der Kommandozeile erhalten hat, mittels der speziellen Variable $@ an den Tar-Befehl. Diese Variable enthält die Liste der Argumente. Der Befehl aus unserem Beispiel sieht dann wie folgt aus:

tar czf /save/mystuff.tgz /home/chavez /new/pix/rachel /jobs/proj5  >/dev/null

Auch hier haben Sie wieder jede Menge Tipparbeit gespart – zwar nicht ganz so viel, wie in der ersten Version des Skripts, dafür arbeitet diese Variante aber wesentlich flexibler.

Eingabedatei

Mit der Methode in Listing 2 ändern Sie die Arbeitsweise des Skripts. Das erste Argument enthält nun eine Datei, die eine Liste der zu archivierenden Verzeichnisse enthält. Die übrigen Argumente behandelt das Skript als einzelne Elemente, die es ebenfalls verwendet – wieder in der schon bekannten Variable $@.

Listing 2

 

#!/bin/bash
DIRS="`cat $1`"            # DIRS = Inhalt der Datei im ersten Argument
shift                      # entfernt das erste Argument aus der Liste
OUTFILE="$(date +%y%m%d)"  # erstellt einen Archivnamen mit Datum
tar czf /tmp/$OUTFILE.tgz $DIRS $@ >/dev/null

Das Skript verwendet die Variablen DIRS und OUTFILE. Gemäß unausgesprochener Konvention und für eine bessere Übersicht verwenden Sie am besten Großbuchstaben in den Variablennamen – zwingend erforderlich ist das aber nicht. Mit der ersten Anweisung speichert das Skript den Inhalt der im ersten Argument angegebenen Datei. Durch das Setzen der Backticks fügen Sie statt des Cat-Befehls selbst dessen Ausgabe ein.

Das klappt mit jedem Befehl, den Sie zwischen die Backticks setzen. Auf diese Weise führt die Shell diesen zuerst aus und setzt die Ausgabe an dieser Stelle ein. Steht dieses Konstrukt innerhalb einer Anweisung, übernimmt diese anschließend die Ausgabe.

Im Beispiel gibt der Befehl cat den Inhalt der als erstes Argument zum Skript angegebenen Datei – also der Verzeichnisliste – aus und fügt diese innerhalb der doppelten Anführungszeichen in die Zuordnung für die Variable DIRS ein. Zeilenumbrüche in der Datei der Verzeichnisliste spielen dabei keine Rolle, die Shell wandelt diese in Leerzeichen um.

Nach dem Einlesen der Datei und dem Abarbeiten des ersten Arguments entfernt die Anweisung shift den Dateinamen aus der Liste. Die neue Liste der Argumente enthält zudem Verzeichnisse, sofern Sie diese zuvor in der Kommandozeile angegeben haben, und $@ expandiert wieder zur gewünschten Liste: Das Skript ersetzt die Variable durch die Verzeichnisnamen. Der Mechanismus ermöglicht es also, eine feste Liste von Elementen zum Archivieren im Skript zu speichern und – falls nötig – weitere Elemente als Parameter mit einzubeziehen.

Die dritte Anweisung definiert die Variable OUTFILE, diesmal unter Zuhilfenahme des Kommandos date. Die Syntax $(...) entspricht dem Verwenden von Backticks (siehe auch Kasten "Backticks oder nicht?"). Die Art von Operation ist unter dem Namen Kommandosubstitution bekannt.

In der letzten Zeile steht dann der eigentliche Tar-Befehl, der nun die Liste aus der Datei sowie eventuelle zusätzliche Argumente berücksichtigt, die Sie archivieren wollen. Verwenden Sie eine Variable innerhalb einer anderen Anweisung, vergessen Sie nie das Dollar-Zeichen vor den Variablennamen zu setzen, wie zum Beispiel $DIRS.

Backticks oder nicht?

Bei der Kommando-Substitution hat bereits vor geraumer Zeit die Schreibweise $(...) die ältere Variante mit Backticks abgelöst. Dafür gibt es gute Gründe:

  • Bessere Lesbarkeit: In vielen Darstellungsformen verwechselt man den Backtick ` sehr leicht mit dem einfachen Anführungszeichen '.
  • Besser einzutippen: Auf vielen internationalen Keyboard-Layouts lässt sich der Backtick nur schwer erreichen, auf manchen fehlt er ganz (etwa bei italienischen Standard-Keyboards).
  • Eindeutigere Syntax: Insbesondere beim Verschachteln von Substitutionen sowie beim Quoting entsteht ein übersichtlicheres Konstrukt.

Daher sollten Sie in Ihren Skripten der Variante $(...) gegenüber der in der Bash zwar noch funktionierenden, aber als obsolet geltenden Backtick-Methode den Vorzug einräumen. Es gibt eigentlich nur zwei Gründe, den Backtick noch zu nutzen: die Macht der Gewohnheit (viele routinierte Skript-Autoren sind mit dem "Fliegenschiss" aufgewachsen) und den Zwang zur Kompatibilität mit älteren Shells (Bourne- und Korn-Shell) insbesondere auf anderen Unix-Systemen.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 9 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Raspberry Pi Geek kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Foto-Backup auf RasPi-Basis (Teil 2)

    Auf einer Reise läuft man immer Gefahr, dass die Kamera abhanden kommt. Daher sollte man tunlichst seine Schnappschüsse auch unterwegs sichern. Der Fototank erledigt das – und präsentiert die Bilder in der erweiterten Version nun auch per Webserver.

  • Das C-Berry-Display als Touchscreen

    Das LCD-Modul C-Berry ist zu einem vollwertigen Touchscreen herangewachsen, der sich für grafische Ausgaben auf kleinsten Raum eignet und nun auch das Steuern berührungsgeführter Anwendungen erlaubt.

  • Raspberry Pi 3 Modell B+ im Überblick

    Der neue RasPi 3 Modell B+ sticht seinen Vorgänger in zahlreichen Punkten aus. Unser Test zeigt, was die neue Variante leistet.

  • Bastelrouter Banana Pi R1 im Überblick

    Der Banana Pi R1 lockt als Kombination aus Switch, Access Point und Server die Sparfüchse auf den Plan. Die Hardware erfordert jedoch einige Kompromisse.

  • Editorial 01/2016

    Der Raspberry Pi ist mehr, als nur einer von vielen Bastelrechnern: In einer Zeit, in der immer mehr Firmen, Staaten und Behörden dem Bürger an die Daten wollen, glänzt er als ebenso preiswerter wie effizienter Baustein für ein persönliches Privacy- und Security-Konzept.

Aktuelle Ausgabe

10/2019
Raspberry Pi 4B

Diese Ausgabe als PDF kaufen

Preis € 9,99
(inkl. 19% MwSt.)

Stellenmarkt

Neuigkeiten

  • Sonnige Zeiten

    UV-Strahlung ist für das menschliche Auge unsichtbar, was sie umso gefährlicher macht. Die Höhe der tatsächlichen Belastung verrät Ihnen das Selbstbauprojekt UV-Sensor.

  • Gut verpackt

    Für das Ansteuern kleiner Displays gibt es keine Programme von der Stange. Mit Python und einer Pygame-Bibliothek erstellen Sie trotzdem im Handumdrehen Anwendungen.

  • Macro-Mini-Micro-Bit

    Was dem Raspberry Pi für die Computerwelt gelungen ist, versucht der BBC Micro:bit für Mikrocontroller zu wiederholen. Das für Schüler entwickelte Kit hilft beim Einstieg in die hardwarenahe Programmierung.

  • Vorhang auf

    Mit dem modernen Video-Codec HEVC (H.265) erstellte Filme spielen bisherige RasPi-Modelle oft nur ruckelnd ab. Wir testen, ob der neue Raspberry Pi 4B das besser kann.

  • Überraschung!

    Eine optimierte Architektur und mehr RAM beschleunigen den RasPi 4B deutlich. Wir prüfen, wie gut sich der Neuling als Desktop-Rechner schlägt.

  • Durchgestartet

    Ein Stresstest zeigt, wie sich der neue Raspberry Pi 4 Modell B gegenüber den älteren Modellen abhebt.

  • Vierte Generation

    Eine schnellere CPU, USB 3.0 und Gigabit-Ethernet sind nur die Highlights des Raspberry Pi 4B: Das Board bringt viele weitere Neuerungen mit.

  • Tiefenmesser

    Um die Pumpe in einem Brunnenschacht möglichst genau zu positionieren, brauchen Sie dessen Tiefe. Die ermitteln Sie mithilfe eines präzisen Messgeräts aus einem Luftdrucksensor und einem Mikrocontroller.

  • Faktencheck

    Das via DVB-T2 ausgestrahlte Digital-TV liefert Bilder in HD-Qualität. Der dabei eingesetzte H.265-Standard überfordert allerdings kleine Mini-Rechner wie den Raspberry Pi – oder geht es doch?

  • Zugriff von außen

    React Native erlaubt es, Apps mit wenigen Zeilen Code zu programmieren. Mit einem entsprechenden Server sprechen Sie so den RasPi vom Smartphone aus an.