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

08/2019
Smarte Hacks

Diese Ausgabe als PDF kaufen

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

Stellenmarkt

Neuigkeiten

  • Immer der Reihe nach

    Mit einer einfachen Schaltung testen Sie Bausteine, die über den SPI-Bus miteinander kommunizieren.

  • Einzigartig

    Eine MAC-Adresse ermöglicht die Kommunikation im Netzwerk. Der 24AA02E48 liefert sie für Setups, die aus grundlegenden Komponenten bestehen.

  • Steinkuchen

    Der Raspberry Pi hat viele Fans, doch nicht ohne Grund sehnen sich viele Anwender nach einem RasPi 4. Der Rock Pi 4 übertrumpft den RasPi 3 in Sachen Leistung um Längen und schlägt sich auch in der Praxis gut.

  • Kerngeschäft

    Der Einstieg in die Welt der Mikrocontroller fällt nicht ganz leicht. Mit dem Nucleo F401RE haben Sie jedoch ein Entwicklerboard samt abgestimmter Entwicklungsumgebung an der Hand.

  • Himbeer-Geräte

    Mit Maus und Tastatur im weiß-roten Raspberry-Look macht die Raspberry Pi Foundation das eigene Angebot an Peripheriegeräten für den Mini-Rechner komplett.

  • Unter Kontrolle

    PiCockpit ist eine speziell auf den RasPi zugeschnittene Online-Monitoring-Lösung. Wir werfen einen ersten Blick auf den brandneuen und in Ausbau befindlichen kostenlosen Dienst.

  • Ins rechte Licht gesetzt

    Selbst ohne eigenen Garten holen Sie sich Pflanzen mithilfe von LEDs in jeden Raum und sehen ihnen mit dem RasPi beim Wachsen zu.

  • Helligkeit nach Maß

    Wer bei wechselnden Lichtverhältnissen nicht ständig die Beleuchtung manuell nachregeln möchte, der spannt dafür einen PiXtend ein.

  • Geschrumpft

    Kleine Bildschirme gibt es zwar viele, aber der Support von Raspbian ist überraschend schlecht. Mit ein paar Tricks erzielen Sie trotzdem ein optimales Ergebnis.

  • Brüllwürfel

    Kompakt-Stereoanlagen mit CD-Spieler und Kassettendeck sind inzwischen oft ein Fall für den Recyclinghof – oder für die digitale Wiederbelebung mit einem RasPi und etwas Geschick.