26.02.2014 Aufrufe

EasyLinux Programme und Skripte (Vorschau)

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

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!