24.03.2014 Aufrufe

LinuxUser SHELL - Administrieren und Automatisieren ohne GUI (Vorschau)

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!