Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Shell-<strong>Skripte</strong><br />
Titel<br />
Sie hier, dass Sie beim Setzen<br />
einer Variable den Namen ohne<br />
Dollarzeichen benutzen, beim<br />
Zugriff auf den Inhalt hingegen<br />
ein Dollarzeichen voranstellen<br />
müssen. Wenn $HOME z. B.<br />
den Wert /home/user hat, ergibt<br />
sich über die Definitionen von<br />
ZIEL <strong>und</strong> DATE ein Befehl der<br />
Form mkdir ‐p /home/user/Pictures/Import/2011‐09‐30.<br />
Die<br />
Option ‐p für das mkdir-Kommando<br />
sorgt dafür, dass eventuell<br />
fehlende Verzeichnisse<br />
„auf dem Weg“ (also .../Pictures/Import<br />
<strong>und</strong> .../Pictures)<br />
gleich mit erzeugt werden, so<br />
dass dieses Kommando nicht<br />
fehlschlagen kann.<br />
mv ‐v $CAMERA/* $ZIEL/$DATE/<br />
Das vorvorletzte Kommando<br />
verschiebt dann alle Dateien im<br />
Bilderordner der Kamera in den Bilderordner<br />
auf Ihrer Festplatte; die Option ‐v sorgt<br />
dafür, dass mv die Namen aller verschobenen<br />
Dateien auf der Konsole ausgibt, damit<br />
Sie den Fortschritt verfolgen können.<br />
sync<br />
echo Bilder kopiert.<br />
Mit sync sorgen Sie schließlich dafür, dass<br />
Sie nach Ausführen des Skripts die Kamera<br />
einfach abstöpseln können, ohne<br />
Datenverlust zu riskieren. Zum Schluss<br />
gibt es noch eine Statusmeldung. Damit<br />
Sie das Skript verwenden können, speichern<br />
Sie es (z. B. als copycam.sh in Ihrem<br />
Home-Verzeichnis) <strong>und</strong> machen es<br />
mit chmod a+x copycam.sh ausführbar.<br />
Dann können Sie es später mit ~/copycam.sh<br />
aufrufen. Wenn Sie die Datei (mit<br />
Root-Rechten) in das Verzeichnis /usr/local/bin/kopieren,<br />
können Sie die Pfadangabe<br />
auch weglassen, also in der Shell<br />
einfach copycam.sh eingeben.<br />
Wenn Sie ein Shell-Skript im Editor bearbeiten,<br />
kommen Sie übrigens in der Regel<br />
in den Genuss von Syntax-Highlighting,<br />
der Editor hebt Schlüsselwörter, Klammern<br />
<strong>und</strong> Variablennamen farbig hervor. Das<br />
funktioniert z. B. in KDEs Editor Kate (Abbildung<br />
1) <strong>und</strong> im Konsoleneditor vi.<br />
Abb. 1: KDEs Editor Kate erkennt Shell-<strong>Skripte</strong> <strong>und</strong> aktiviert<br />
beim Bearbeiten das Syntax-Highlighting.<br />
Bash als Programmiersprache<br />
Richtige Programmiersprachen können<br />
aber mehr, als nur einfache Befehlssequenzen<br />
abzuarbeiten. In der Einführung zum<br />
Programmieren ab Seite 38 haben Sie Fallunterscheidungen<br />
(If-Then-Else-Konstruktionen),<br />
Schleifen (mit dem Spezialfall der<br />
Zählschleife) sowie Prozeduren bzw.<br />
Funktionen kennengelernt. All das gibt es<br />
auch in der Shell. Fallunterscheidungen<br />
haben in der Shell die folgende Syntax:<br />
if Bedingung<br />
then Befehle<br />
else Befehle<br />
fi<br />
Die Befehlsworte sind also if, then, else<br />
<strong>und</strong> fi (eine rückwärts geschriebene Form<br />
von if, die das Ende der Fallunterscheidung<br />
anzeigt). Der Else-Fall muss nicht<br />
vorhanden sein. Das folgende Beispielskript<br />
exist prüft, ob eine Datei existiert:<br />
#!/bin/bash<br />
if test "$1" = ""<br />
then echo "$0: mit Dateinamen aufrufen!";U<br />
exit<br />
fi<br />
if test ‐e $1<br />
then echo $1 existiert<br />
else echo $1 existiert nicht<br />
fi<br />
Der erste Test prüft mit dem in die Shell<br />
eingebauten Kommando test, ob das Skript<br />
überhaupt mit einem Argument aufgerufen<br />
wurde ($1 ist das erste Argument; wenn es<br />
das nicht gibt, ist $1 ein leerer String). Ist<br />
kein Argument vorhanden, bricht das Programm<br />
mit exit ab. Das funktioniert, weil<br />
das Skript in einer „Sub-Shell“, also einem<br />
eigenen Shell-Prozess läuft.<br />
Zum Then-Fall gehören also<br />
zwei Kommandos, die hier mit<br />
einem Semikolon voneinander<br />
getrennt sind – Sie können sie<br />
alternativ auch in mehrere Zeilen<br />
des Programms schreiben.<br />
Oft stehen auch then <strong>und</strong> else<br />
alleine in jeweils einer Zeile,<br />
<strong>und</strong> die Kommandos für die<br />
beiden Fälle folgen darunter.<br />
Eine üblichere (wenn auch weniger<br />
kompakte Schreibweise)<br />
der ersten Fallunterscheidung<br />
ist damit die folgende:<br />
if test "$1" = ""<br />
then<br />
echo "$0: mit Dateinamen aufU<br />
rufen!"<br />
exit<br />
fi<br />
Ein direkter Vergleich mit if<br />
"$1" = "" ist übrigens nicht<br />
möglich: Die Bedingung in einer Fallunterscheidung<br />
muss immer ein Kommando<br />
sein, dessen Rückgabewert die Shell dann<br />
prüft. Zum Beispiel gibt es die beiden <strong>Programme</strong><br />
true <strong>und</strong> false, die beide keine<br />
sichtbare Funktion haben, aber die Rückgabewerte<br />
0 <strong>und</strong> 1 produzieren:<br />
$ true; echo $?<br />
0<br />
$ false; echo $?<br />
1<br />
$ if true; then echo Ja; else echo Nein; fi<br />
Ja<br />
Zurück zum exist-Skript: Der zweite Test<br />
ruft test ‐e $1 auf. Wenn Sie in die Dokumentation<br />
zu test schauen (das geht mit<br />
help test, weil test ein Shell-Builtin, also<br />
ein fest in die Shell eingebautes Kommando<br />
ist), sehen Sie, dass das Kommando<br />
über ‐e dateiname prüft, ob eine<br />
bestimmte Datei vorhanden ist.<br />
Listing 1: kopieren<br />
#!/bin/bash<br />
CAMERA=/media/camera/DCIM/100XYZAB<br />
ZIEL=$HOME/Pictures/Import<br />
DATE=$( date +%Y‐%m‐%d )<br />
mkdir $ZIEL/$DATE<br />
mv ‐v $CAMERA/* $ZIEL/$DATE/<br />
sync<br />
echo Bilder kopiert.<br />
<strong>EasyLinux</strong><br />
03/2013<br />
www.easylinux.de<br />
49