AA_helper_svilen001_sxc_1237610.jpg

© Svilen001, sxc.hu

Kleine Helfer

Erste Schritte mit Bash-Skripten

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

Shell-Skripte sind der beste Freund bequemer Menschen. Das mag seltsam klingen, denn das Schreiben eines Shell-Skripts setzt Können und Arbeit voraus, trotzdem stimmt es: Schreiben Sie ein Shell-Skript zum Erledigen von sich wiederholenden Aufgaben, rentiert sich die investierte Zeit in der Zukunft mehrfach. Außerdem ist das Schreiben eines Shell-Skripts eine Herausforderung, die viel Freude macht. Die nicht nur Bequemen, sondern auch Cleveren nehmen sich deshalb Zeit fürs Erlernen der Shell-Befehle und das Schreiben von Skripten.

Dieser Artikel fasst die Grundlagen zum Schreiben von Shell-Skripten mit Bash im Kontext einiger allgemeinen Aufgaben im Zusammenhang mit dem PC zusammen. Dabei erhalten Sie die wichtigsten Informationen, um gleich mit dem Schreiben eigener Skripte zu beginnen. Eine kurze Zusammenfassung der im Artikel 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 archivierende 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 sollte hier stehen
  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 darauf folgenden Befehle ab.

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

Die neue Variante bietet außerdem einen weiteren 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 von 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 Skriptes. 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 die bessere Übersicht verwenden Sie am besten Großbuchstaben für die Variablennamen – zwingend erforderlich ist das aber nicht. Mit der erste Anweisung speichert das Skript den Inhalt der im ersten Argument angegebenen Datei. Durch das Setzen der Backticks fügen Sie die Ausgabe des Cat-Befehls statt des Befehls selbst einzufügen.

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 Datei, angegeben als erstes Argument zum Skript – nämlich die Verzeichnisliste – aus und fügt diese innerhalb der doppelten Anführungszeichen in die Zuordnung ein und definiert dadurch die Variable DIRS. Zeilenumbrüche in der Datei der Verzeichnisliste spielen dabei keine Rolle: Diese wandelt die Shell in Leerzeichen um.

Nachdem die Datei eingelesen ist und das Skript das erste Argument abgearbeitet hat, nutzen Sie die Anweisung shift, um den Dateinamen aus der Liste zu entfernen. Die neue Liste der Argumente enthält zudem Verzeichnisse, sofern Sie diese zuvor in der Kommandozeile angegeben haben, und $@ expandiert wieder zu der gewünschten Liste: Das Skript ersetzt die Variable durch die Verzeichnisnamen. Der Mechanismus ermöglicht es also, zuerst 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 Kommando-Substitution 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 dem Variablennamen zu setzen, wie zum Beispiel $DIRS.

Backticks oder nicht?

Bei der Kommandosubstitution hat bereits vor geraumer Weile 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.

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 

Ähnliche Artikel

  • Ohne Crash durch die Bash
    Mit der Bourne-Again-Shell schreiben Linux-Anwender Skripte, die nervige und stupide Aufgaben automatisieren – etwa um auf dem Notebook Strom einzusparen.
  • Bash-Skripte sind Programme
    Wer regelmäßig mit der Shell arbeitet, wird leicht zum Programmierer: Schreiben Sie mehrere Shell-Befehle in eine Textdatei und machen diese ausführbar, haben Sie schon Ihr erstes Shell-Skript entwickelt. Die Shell bietet als Programmiersprache aber noch viel mehr.
  • Alltagsaufgaben mit Skripten beschleunigen
    Ein Themenschwerpunkt Beschleunigung darf die Shell nicht auslassen, denn der Grundtenor unserer Guru-Training-Rubrik ist doch, dass Sie auf der Shell schneller als mit GUI-Tools arbeiten. Wir geben ein paar nützliche Beispiele.
  • Mit SHC Bash-Skripte kompilieren
    Der Shell Script Compiler wandelt Skripte in Binärprogramme um. Das schützt vor unbeabsichtigten Veränderungen, birgt aber auch einige Tücken.
  • Bash-Kurs Teil 6
    Die elementaren Konfigurationsmöglichkeiten mit eingebauten Funktionen der Bash sind der Schwerpunkt dieses Teils. Im nächsten wird ein komfortables Tool zur Erzeugung von Konfigurationsdateien vorgestellt.
Kommentare

Infos zur Publikation

LU 12/2014: ANONYM & SICHER

Digitale Ausgabe: Preis € 4,95
(inkl. 19% MwSt.)

Mit der Zeitschrift LinuxUser sind Sie als Power-User, Shell-Guru oder Administrator im kleinen Unternehmen monatlich auf dem aktuelle Stand in Sachen Linux und Open Source.

Sie sind sich nicht sicher, ob die Themen Ihnen liegen? Im Probeabo erhalten Sie drei Ausgaben zum reduzierten Preis. Einzelhefte, Abonnements sowie digitale Ausgaben erwerben Sie ganz einfach in unserem Online-Shop.

NEU: DIGITALE AUSGABEN FÜR TABLET & SMARTPHONE

HINWEIS ZU PAYPAL: Die Zahlung ist auch ohne eigenes Paypal-Konto ganz einfach per Kreditkarte oder Lastschrift möglich!       

Tipp der Woche

Ubuntu 14.10 und VirtualBox
Ubuntu 14.10 und VirtualBox
Tim Schürmann, 08.11.2014 18:45, 0 Kommentare

Wer Ubuntu 14.10 in einer virtuellen Maschine unter VirtualBox startet, der landet unter Umständen in einem Fenster mit Grafikmüll. Zu einem korrekt ...

Aktuelle Fragen

Nach Ubdates alles weg ...
Maria Hänel, 15.11.2014 17:23, 4 Antworten
Ich brauche dringen eure Hilfe . Ich habe am wochenende ein paar Ubdates durch mein Notebook von...
Brother Drucker MFC-7420
helmut berger, 11.11.2014 12:40, 1 Antworten
Hallo, ich habe einen Drucker, brother MFC-7420. Bin erst seit einigen Tagen ubuntu 14.04-Nutzer...
Treiber für Drucker brother MFC-7420
helmut berger, 10.11.2014 16:05, 2 Antworten
Hallo, ich habe einen Drucker, brother MFC-7420. Bin erst seit einigen Tagen ubuntu12.14-Nutzer u...
Can't find X includes.
Roland Welcker, 05.11.2014 14:39, 1 Antworten
Diese Meldung erhalte ich beim Versuch, kdar zu installieren. OpenSuse 12.3. Gruß an alle Linuxf...
DVDs über einen geeigneten DLNA-Server schauen
GoaSkin , 03.11.2014 17:19, 0 Antworten
Mein DVD-Player wird fast nie genutzt. Darum möchte ich ihn eigentlich gerne abbauen. Dennoch wür...