Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Bash-Skripting<br />
schwerpunkt<br />
chmod u+x mytar – vorausgesetzt,<br />
die Datei liegt im aktuellen Verzeichnis.<br />
Der Rest des Skripts nach dem<br />
Shebang besteht aus dem eigentlichen<br />
Tar-Befehl mit den zu verarbeitenden<br />
Pfaden <strong>und</strong> Dateinamen.<br />
Der folgende Befehl führt<br />
das Skript aus, woraufhin einige<br />
Meldungen von Tar folgen:<br />
$ ./mytar<br />
Damit haben Sie die Anzahl der<br />
Anschläge, die zum Erzeugen eines<br />
Archivs nötig sind, von etwa<br />
75 Zeichen auf 8 Zeichen reduziert.<br />
Allerdings ließe sich das<br />
Skript noch etwas allgemeiner –<br />
<strong>und</strong> damit auch nützlicher – gestalten,<br />
indem Sie die zu archivierenden<br />
Dateien in der Kommandozeile<br />
angeben:<br />
$ ./mytar /home/chavez /new/pix/U<br />
rachel /jobs/proj5<br />
Mit diesem Befehl archivieren Sie<br />
eine andere Gruppe von Dateien.<br />
Das modifizierte Skript sehen Sie<br />
in Listing 1.<br />
Es gibt darin einige neue Features:<br />
Der Tar-Befehl verwendet<br />
jetzt Ein- <strong>und</strong> Ausgabeumleitung,<br />
um alle Meldungen zu unterdrücken,<br />
die sich nicht auf Fehler beziehen.<br />
Der Befehl befindet sich<br />
innerhalb einer If-Anweisung. Erweist<br />
sich die in eckigen Klammern<br />
angegebene Bedingung als<br />
wahr, arbeitet das Skript die darauf<br />
folgenden Befehle ab.<br />
Das Skript prüft, ob die Anzahl<br />
der Argumente zum Skript, die<br />
Sie in der Variable $# finden, höher<br />
als 0 liegt. Trifft das zu, hat<br />
der Benutzer einen oder mehrere<br />
Pfade fürs Archivieren angegeben.<br />
Fehlen die Parameter, gibt es<br />
nichts zu tun, der Befehl kommt<br />
also nicht zum Einsatz.<br />
Die neue Variante bietet außerdem<br />
einen weiteren Vorteil: Das<br />
Skript übergibt die Argumente,<br />
die es auf der Kommandozeile erhalten<br />
hat, mittels der speziellen<br />
Variable $@ an den Tar-Befehl.<br />
Diese Variable enthält die Liste<br />
der Argumente. Der Befehl von<br />
unserem Beispiel sieht dann wie<br />
folgt aus:<br />
tar czf /save/mystuff.tgz /home/U<br />
chavez /new/pix/rachel /jobs/proU<br />
j5 >/dev/null<br />
Auch hier haben Sie wieder jede<br />
Menge Tipparbeit gespart – zwar<br />
nicht ganz so viel, wie in der ersten<br />
Version des Skripts, dafür arbeitet<br />
diese Variante aber wesentlich<br />
flexibler.<br />
#!/bin/bash<br />
Eingabedatei<br />
Mit der Methode in Listing 2 ändern<br />
Sie die Arbeitsweise des<br />
Skripts. Das erste Argument enthält<br />
nun eine Datei, die eine Liste<br />
der zu archivierenden Verzeichnisse<br />
enthält. Die übrigen Argumente<br />
behandelt das Skript als<br />
einzelne Elemente, die es ebenfalls<br />
verwendet, wieder in der<br />
schon bekannten Variable $@.<br />
Das Skript verwendet die Variablen<br />
DIRS <strong>und</strong> OUTFILE. Gemäß unausgesprochener<br />
Konvention <strong>und</strong><br />
für die bessere Übersicht verwenden<br />
Sie am besten Großbuchstaben<br />
für die Variablennamen –<br />
zwingend erforderlich ist das aber<br />
nicht. Mit der ersten Anweisung<br />
speichert das Skript den Inhalt<br />
der im ersten Argument angegebenen<br />
Datei. Durch das Setzen<br />
der Backticks fügen Sie die Ausgabe<br />
des Cat-Befehls ein statt des<br />
Befehls selbst einzufügen.<br />
Das klappt mit jedem Befehl,<br />
den Sie zwischen die Backticks<br />
setzen. Auf diese Weise führt die<br />
Shell diesen zuerst aus <strong>und</strong> setzt<br />
die Ausgabe an dieser Stelle ein.<br />
Steht dieses Konstrukt innerhalb<br />
einer Anweisung, übernimmt diese<br />
anschließend die Ausgabe. Im<br />
Beispiel gibt der Befehl cat den<br />
Inhalt der Datei, angegeben als<br />
erstes Argument zum Skript –<br />
nämlich die Verzeichnisliste – aus<br />
<strong>und</strong> fügt diese innerhalb der doppelten<br />
Anführungszeichen in die<br />
Zuordnung ein <strong>und</strong> definiert dadurch<br />
die Variable DIRS. Zeilenumbrüche<br />
in der Datei der Verzeichnisliste<br />
spielen dabei keine Rolle:<br />
Diese wandelt die Shell in Leerzeichen<br />
um.<br />
Nachdem die Datei eingelesen<br />
ist <strong>und</strong> das Skript das erste Argument<br />
abgearbeitet hat, nutzen Sie<br />
die Anweisung shift, um den Dateinamen<br />
aus der Liste zu entfernen.<br />
Die neue Liste der Argumente<br />
enthält zudem Verzeichnisse,<br />
sofern Sie diese zuvor in der<br />
Kommandozeile angegeben haben,<br />
<strong>und</strong> $@ expandiert wieder zu<br />
der gewünschten Liste: Das<br />
Skript ersetzt die Variable durch<br />
die Verzeichnisnamen. Der Mechanismus<br />
ermöglicht es also, zuerst<br />
eine feste Liste von Elementen<br />
zum Archivieren im Skript zu<br />
speichern <strong>und</strong> – falls nötig – weitere<br />
Elemente als Parameter miteinzubeziehen.<br />
Die dritte Anweisung definiert<br />
die Variable OUTFILE, diesmal unter<br />
Zuhilfenahme des Kommandos<br />
date. Die Syntax $(...) entspricht<br />
dem Verwenden von Backticks<br />
(siehe Kasten Backticks oder<br />
nicht? auf der nächsten Seite).<br />
Diese Art von Operation ist unter<br />
dem Namen Kommando-Substitution<br />
bekannt.<br />
In der letzten Zeile steht dann<br />
der eigentliche Tar-Befehl, der<br />
nun die Liste aus der Datei sowie<br />
eventuelle zusätzliche Argumente<br />
berücksichtigt, die Sie archivieren<br />
wollen. Verwenden Sie eine<br />
Listing 2<br />
DIRS="`cat $1`"<br />
# DIRS = Inhalt der Datei im ersten<br />
Argument<br />
shift<br />
# entfernt das erste Argument aus der Liste<br />
OUTFILE="$(date +%y%m%d)" # erstellt einen Archivnamen mit Datum<br />
tar czf /tmp/$OUTFILE.tgz $DIRS $@ >/dev/null<br />
www.linux-user.de<br />
10 | 11 21