20.07.2013 Aufrufe

3 UNIX und Linux: Benutzerschnittstelle, Script-Programmierung ...

3 UNIX und Linux: Benutzerschnittstelle, Script-Programmierung ...

3 UNIX und Linux: Benutzerschnittstelle, Script-Programmierung ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

3 <strong>UNIX</strong> <strong>und</strong> <strong>Linux</strong>: <strong>Benutzerschnittstelle</strong>, <strong>Script</strong>-<strong>Programmierung</strong> <strong>und</strong><br />

wichtige Dienstprogramme<br />

Sichtweisen<br />

• Benutzersicht an der <strong>Benutzerschnittstelle</strong><br />

• Sicht des Systemprogrammierers an der C-Schnittstelle oder Systemschnittstelle<br />

• interne Sicht des Kerns (Sicht auf die betriebssysteminterne Implementierung der<br />

Funktionen <strong>und</strong> Datenstrukturen des Kerns)<br />

aus Ehses: Betriebssysteme<br />

3.1 Benutzersicht an der <strong>Benutzerschnittstelle</strong><br />

Dateisystem<br />

• Dateien sind langlebige Datenobjekte<br />

müssen vom System verwaltet werden ⇒<br />

• Benutzer / Prozesse können darauf zugreifen<br />

Shell ⇒<br />

• Inhalt:<br />

C-Programm, ⇒<br />

ASCII-Text, Datensätze,..<br />

Viele denkbare interne Strukturen<br />

für <strong>UNIX</strong> lediglich Folge von Bytes<br />

zugreifbar (Startposition angebbar) ⇒ sequentiell<br />

Dateiname:<br />

• muss Datei eindeutig benennen<br />

• im Prinzip beliebige Zeichenfolge aus Buchstaben, Ziffern <strong>und</strong> Sonderzeichen<br />

(bei vielen Systemen maximal 255 Zeichen)<br />

• Konvention: Typ des Inhalts wird angehängt (bla.o, bla.c, bla.ps ...)<br />

• versteckte Datei: beginnt mit einem Punkt (z.B. Konfigurationsdateien)<br />

⇒<br />

1


Arten von Dateien:<br />

• gewöhnliche Dateien (regular files) Text oder Binärdateien, auf die<br />

wahlfreier Zugriff möglich ist<br />

• Verzeichnisse (directories) enthalten Verweise auf Dateien <strong>und</strong> weitere<br />

Verzeichnisse<br />

• Gerätedateien (device special files) Schnittstellen zur Hardware, in der<br />

Regel ist nur serieller oder blockweiser Lese- <strong>und</strong>/oder Schreibzugriff möglich<br />

• Pipes (regular/named pipes) ermöglichen Datenaustausch zwischen<br />

Prozessen, arbeiten nach dem Prinzip eines FIFO-Puffers <br />

Der Dateibaum<br />

• Strukturierung von Dateisammlungen<br />

- Dateisammlungen können sehr groß werden<br />

sollten strukturiert werden ⇒<br />

- Dateien werden in Verzeichnisse eingeordnet<br />

„thematische“ Gliederung möglich ⇒<br />

- Verzeichnisse werden hierarchisch angeordnet<br />

weitgehende Gliederung ⇒<br />

• Bei Anmeldung gelangt man in sein Verzeichnis Eintrag in /etc/passwd<br />

• gleiche Dateinamen können in mehreren Verzeichnissen verwendet werden Dateien<br />

sind somit nur im Kontext des Verzeichnisses eindeutig<br />

• vollständige Dateinamen sind Pfadnamen von der Wurzel abwärts<br />

• Dateinamen müssen nicht vollständig angegeben werden, sondern es können folgende<br />

Konventionen genutzt werden ⇒ <br />

Verzeichniskonventionen:<br />

• „.“ deutet auf aktuelles Verzeichnis, “..“ auf übergeordnetes Verzeichnis<br />

• „~“ steht für eigenes Home-Verzeichnis, in Verbindung mit Namen für Home-<br />

Verzeichnis des entsprechenden Benutzers, z.B. ~pohle<br />

• in der Shell Definition <strong>und</strong> Benutzung von entsprechenden Variablen möglich<br />

• beginnt der Pfad mit einem „/“, so wird er absolut interpretiert, ansonsten erfolgt<br />

Interpretation relativ zum aktuellen Verzeichnis<br />

Hilfsprogramme<br />

/bin - essentielle Programme, wie z.B. sh, ls, rm, mv, mkdir usw.<br />

/sbin - Programme, die vom System selbst benötigt werden, wie z.B. fsck, mount, ifconfig<br />

/usr/bin - Editoren, Compiler, Interpreter <strong>und</strong> andere wertvolle Utilities<br />

2


3.2 Shell<br />

• Die Shell wird für jeden Benutzer nach dem Einloggen gestartet<br />

• Sie ist<br />

- ein Kommandointerpreter, der das Nutzerinterface zu dem Kernel <strong>und</strong> zu den<br />

Unix-Hilfsprogrammen herstellt<br />

- eine Programmiersprache zur Kombination der Hilfsprogramme<br />

• Hauptmerkmale:<br />

- erlaubt Ausführung der Unix-Kommandos, sowohl synchron als auch<br />

asynchron (Vordergr<strong>und</strong>/Hintergr<strong>und</strong>)<br />

- Ein-<strong>und</strong> Ausgabeumleitung (Lesen/Schreiben von Eingaben/Ausgaben/Fehlern<br />

in/von Dateien anstatt vom stdin/stdout/stderr)<br />

- Kopplung von Kommandos durch Pipes<br />

- Manipulation der Umgebungsvariablen<br />

• Die Shell ist kein Teil des Kernels, sondern Prozess ohne spezielle Privilegien<br />

• Die Shell hat beim Öffnen automatisch Zugriff auf eine Datei, die als Standardeingabe<br />

(zum Lesen, Filedeskriptor 0) bezeichnet wird, auf eine Datei Standardausgabe (zum<br />

Schreiben, Filedeskriptor 1) <strong>und</strong> auf eine Datei Standardfehlerausgabe (Filedeskriptor<br />

2). Alle drei Dateien sind standardmäßig mit dem Terminal verb<strong>und</strong>en (Eingabe über<br />

Tastatur, Ausgabe auf den Bildschirm).<br />

Shell-Versionen:<br />

sh: Bourne-Shell<br />

csh: C-shell<br />

tcsh: erweiterte Version der C-Shell<br />

ksh: Korn-Shell<br />

bash: erweiterte Version der Bourne-Shell<br />

Die voreingestellte Shell für den Nutzer kann im File /etc/passwd gesetzt werden.<br />

Finden mit: echo $SHELL<br />

Ändern mit: chsh<br />

Benutzerkommandos<br />

• Benutzer kann Kommandos mit der folgenden Syntax eingeben<br />

kommando_name {-option} [argument} [&]<br />

• Kommandos können sein:<br />

- Alias<br />

- Shell-Funktion<br />

- internes (built-in) Kommando<br />

- externes Kommando<br />

- Shell-<strong>Script</strong><br />

• Es existieren Kommandos zur<br />

- Dateiverwaltung<br />

- Prozessverwaltung<br />

- Sitzungsverwaltung<br />

- Ausgabe von Dateiinhalten auf Geräte<br />

- Aufruf von Dienstprogrammen<br />

Bei der Interpretation von Kommandos wird folgende Abarbeitungs-Reihenfolge eingehalten:<br />

1. Alias-Substitution, 2. Built-in Kommandos, 3. Kommandos im Suchpfad<br />

3


Gewinnen von Informationen über Kommandos:<br />

# type name Ausgabe, um was für eine Art von Kommando es sich handelt<br />

# alias Auflistung aller definierten Aliasnamen<br />

# set Ausgabe aller definierten Variablen<br />

# help Auflistung aller internen Kommandos<br />

# whatis command Information über den Zweck des Kommandos<br />

# which command Information über den Speicherort<br />

# man command Unix-Dokumentation des Kommandos<br />

# man -k key Ausgabe einer Liste aller Kommandos, die zum Schlüsselwort passen<br />

# info command Dokumentation des Kommandos, mehr Tutorial als man<br />

<br />

3.2.1 Alias<br />

Alias = vom Benutzer definierte Abkürzung für einen Befehl<br />

Sie können keine Argumente besitzen.<br />

# alias name=value Erzeugen eines Alias<br />

# unalias name Löschen eines Alias <br />

3.2.2 Shell-Funktion<br />

- ermöglichen die Ausführung von einer Gruppe von Kommandos<br />

- Es können Argumente übergeben werden.<br />

- Shell-Funktionen haben eine höhere Priorität als gleichnamige Shell-Kommandos.<br />

# fct_name(){ commands; commands;} oder # function fct_name(){ commands; commands;}<br />

Auflistung<br />

# declare -f der in der aktuellen Shell definierten Funktionen<br />

# export -f fct_name Exportieren des Funktionsnamens analog zu den Variablennamen<br />

# unset fct_name Entfernen der Funktion <br />

Unterschiede zwischen Shell-Funktionen <strong>und</strong> Shell-Kommandos:<br />

− Funktionen erhalten einen Teil des Shell-Speichers <strong>und</strong> brauchen bei Aufruf nicht erst von<br />

der Platte gelesen werden<br />

− Funktionen werden direkt in der aktuellen Shell ausgeführt <strong>und</strong> sind damit viel schneller<br />

als externe Shell-Kommandos oder Shell-<strong>Script</strong>s, für die erst eine Subshell bei der<br />

Ausführung erzeugt werden muss<br />

3.2.3 Interne Kommandos (built-in-Commands)<br />

- Sie sind Teil des internen Quellcodes der Shell.<br />

- Es wird beim Ausführen des Kommandos kein neuer Prozess kreiert.<br />

- Vorteil ist die Ausführungsgeschwindigkeit<br />

- Nachteil: je mehr Kommandos in einer Shell existieren (z.B. 60 in der bash), desto mehr<br />

Speicherplatz wird von der Shell belegt<br />

3.2.4 Externe Kommandos<br />

− Sie befinden sich auf der Festplatte, z.B. in /bin<br />

• Schritte bei der Kommandoausführung:<br />

- Eingabe des Kommandos durch Benutzer<br />

- Analyse des Kommandos durch die Shell<br />

- Prozesserzeugung durch die Shell<br />

- Kommandoausführung durch den Prozess<br />

4


- Zurückliefern des Ergebnisses von dem Prozess an die Shell <strong>und</strong> terminieren<br />

- Weitergabe des Ergebnisses von der Shell an den Benutzer<br />

- Ausgabe des Prompt von der Shell<br />

− Subshell hat gleiche Umgebung (z.B. alle exportierten Variablen gelten hier gleichfalls),<br />

aber es können von Seiten der Subshell keine Änderungen an der Shell vorgenommen<br />

werden<br />

3.3 Wichtige Kommandos<br />

Ausgabe<br />

<br />

Kommandos zu Anzeigen des Inhalts von Dateien<br />

cat Dateiname der Datei<br />

more Dateiname Ausgabe der Datei<br />

less Dateiname Ausgabe der Datei<br />

head Betrachten des Dateianfangs<br />

tail Betrachten des Dateiendes<br />

wc [-Option] Datei Zählen der Wörter<br />

od [-Option] Datei Dump des Dateiinhalts im angegebenen Format<br />

cut [-Option] Datei Entfernen von Bereichen aus jeder Zeile von Dateien<br />

<br />

Kommandos zu Verwalten von Dateien<br />

ls [-Option] Datei Auflisten von Dateien in Verzeichnissen<br />

cp [-Option] Quelldateien Ziel Kopieren von Dateien<br />

mv [-Option] Datei1 Datei2 Umbenennen von Dateien<br />

mv [-Option] Datei Verzeichnis Verschieben von Dateien<br />

rm [-Option] Datei Löschen von Dateien<br />

ln Datei neuerName Anlegen eines Hardlinks<br />

ln -s Datei neuerName Anlegen eines Softlinks<br />

find [path] Datei Suchen von Dateien in einer Verzeichnishierarchie<br />

Hardlink<br />

Abb. aus: http://www.feyrer.de/SA/03-hilfsprogramme.html<br />

5


Symbolischer (Soft-) Link<br />

Abb. aus: http://www.feyrer.de/SA/03-hilfsprogramme.html<br />

Kommandos zu Verwalten von Verzeichnissen<br />

pwd Anzeigen des aktuellen Pfads<br />

cd Verzeichnis Wechseln in das Verzeichnis<br />

mkdir Name Erzeugen eines Verzeichnisses<br />

rmdir name Löschen eines Verzeichnisses<br />

du Ausgabe der Plattennutzung<br />

<br />

Kommandos für Benutzer <strong>und</strong> Zugriffsrechte<br />

id Ausgabe von UID <strong>und</strong> GID<br />

whoami Ausgabe des Benutzernamens<br />

groups Ausgabe des Gruppennamens<br />

chown user file Ändern des Eigentümers einer Datei<br />

chgrp group file Ändern der Gruppe einer Datei<br />

chmod [ugo][+-=][rwx] file Ändern der Zugriffsrechte<br />

umask Ausgabe der aktuell gesetzten Rechte<br />

touch dateiname Setzen eines neuen Zeitstempels, falls Datei noch nicht existiert,<br />

wird leere Datei angelegt, sinnvoll für Protokolldateien<br />

Bedeutung bei Dateien für<br />

Besitzer(user – u), Gruppe (group – g), Rest (others – o), alle (all – a)<br />

x - Ausführungrecht, r - Leserecht, w – Schreibrecht<br />

+: Rechte werden zusätzlich zu den vorhandenen vergeben, -: Rechte werden<br />

entzogen, =: Rechte ersetzen die bisherigen Rechte<br />

Beispiele:<br />

a = r Alle dürfen nur lesen<br />

u + w Der Besitzer erhält zusätzlich Schreibrecht<br />

o - r Der „Welt“ wird Leserecht entzogen<br />

go = rx Der Gruppe <strong>und</strong> der „Welt“ wird Les- <strong>und</strong> Ausführungsrecht erteilt<br />

6


Oktalzahl-Darstellung der Rechte<br />

r w x Kennzahl Bedeutung<br />

0 0 0 0 keine Rechte<br />

0 0 1 1 Ausführung, weder Lesen noch Schreiben<br />

0 1 0 2 Nur Schreibrecht<br />

0 1 1 3 Schreib- <strong>und</strong> Ausführungsrecht, kein Lesen<br />

1 0 0 4 Nur Leserecht<br />

1 0 1 5 Lese- <strong>und</strong> Ausführungsrecht<br />

1 1 0 6 Lese- <strong>und</strong> Schreibrecht, kein Ausführungsrecht<br />

1 1 1 7 Lese-, Schreib- <strong>und</strong> Ausführungsrecht<br />

Bedeutung des Fehlens einer Berechtigung bei Verzeichnissen<br />

x - kein Wechsel in das Verzeichnis erlaubt<br />

r - Dateinamen können nicht gelesen werden<br />

w - Dateien dürfen weder gelöscht noch unbenannt oder hinzugefügt werden<br />

Anzeigen<br />

Kommandos für Informationen <strong>und</strong> Handling von Prozessen<br />

ps [-Option] der Prozessliste<br />

kill Prozess-ID oder kill %Jobnummer Abbruch eines Prozesses <br />

Kopplung von Kommandos <strong>und</strong> Umleitung von Ergebnissen<br />

Umleitung der Standardeingabe: <<br />

Umleitung der Standardausgabe: > (Ersetzen des File-Inhalts) , >> (Anhängen an die Datei)<br />

Pipe: Nutzung der Ausgabe des einen Kommandos in der Pipeline als Eingabe für das<br />

nachfolgende Kommando. Sollen mehrere Kommandos als Eingabe in der Pipe<br />

dienen, müssen sie mit einer Klammer verb<strong>und</strong>en werden.<br />

Datenabzweigung: tee (T-Stück) ; zapft eine Pipe an <strong>und</strong> kopiert seine Eingabe sowohl in die<br />

angegebene Datei als auch in die Standardausgabe<br />

Hintergr<strong>und</strong>bearbeitung <strong>und</strong> Reihenfolge:<br />

cp datei1 /test & Abarbeitung im Hintergr<strong>und</strong><br />

ls;date Abarbeitung hintereinander<br />

ls &<br />

date & parallele Abarbeitung der beiden Programme<br />

prog1 && prog2 Start von prog2 nur bei Erfolg von prog1<br />

prog1 || prog2 Start von prog2 nur bei Misserfolg von prog1<br />

fg %Jobnummer Prozess in den Vordergr<strong>und</strong> holen<br />

hg %Jobnummer Prozess in den Hintergr<strong>und</strong> schieben<br />

Nutzung von Wildcards beim Kommandoaufruf<br />

Wildcards: spezielle Symbole, die für ein oder mehr Zeichen stehen (außer Punkt als erstes<br />

Zeichen); werden zur Identifikation von Dateien <strong>und</strong> Verzeichnissen genutzt; erlauben die<br />

Auswahl vieler Dateien durch Angabe von nur einer Spezifikation<br />

* : repräsentiert eine Sammlung von beliebigen Zeichen unterschiedlicher Länge >=0;<br />

(Zeichen kann kein Punkt sein, wenn es das erste Zeichen ist)<br />

?: repräsentiert ein einzelnes beliebiges Zeichen<br />

[...]: Einträge innerhalb der Klammern stehen für ein einzelnes Zeichen<br />

[!...]: Ausschluss aller Zeichen innerhalb der eckigen Klammern<br />

7


3.4 Shell-Variablen<br />

3.4.1 Arten von Variablen<br />

− Betrachtung der Shell als Kommandointerpreter<br />

In diesem Fall hat die Shell eine Umgebung mit vordefinierten Variablen,<br />

Shellfunktionen <strong>und</strong> einer Liste mit Filedeskriptoren für geöffnete Files usw.<br />

Jeder Kindsprozess erhält bei seiner Erzeugung diese aktuelle Umgebung<br />

Umgebungsvariablen (globale Variablen): gekennzeichnet durch Großbuchstaben z.B.<br />

HOME, PATH, PWD, UID, ...<br />

− Betrachtung der Shell als Programmiersprache<br />

Variablen werden zur Speicherung von temporären Informationen benötigt. Sie werden<br />

vom Benutzer oder vom System definiert <strong>und</strong> sind lokal bezogen auf den Prozess.<br />

3.4.2 Erzeugung von Variablen<br />

Direkte Bezeichnung<br />

variable=value variable: erstes Zeichen darf keine Zahl sein<br />

value: String oder bei bash auch Integer-Variable<br />

links <strong>und</strong> rechts vom Gleichheitszeichen sind keine Leerzeichen erlaubt.<br />

Ausgabe des Wertes mit echo $variable<br />

Nutzung des declare-Befehl der bash-Shell:<br />

Erlaubt Zuweisung bestimmter Eigenschaften an die Variable:<br />

> declare –i counter=1 Integer-Variable<br />

> declare –r xyz=“const“ schreibgeschützte Variable<br />

> declare -x xyz=“const“ Export der Variable<br />

Erzeugung durch Einlesen<br />

Nutzung des internen read-Kommandos, Verwendung hauptsächlich in Shell-<strong>Script</strong>s<br />

echo –n “Eingabe der Namen:”<br />

read x1 x2 x3<br />

> read x1 x2 x3<br />

123 456 789 abc def<br />

> echo $x1 @ $x2 @ $x3 @<br />

123 @ 456 @ 789 abc def @<br />

Zuweisung der Ausgabe eines Kommandos zu einer Variablen<br />

variable=$(command) (in älteren Shell-Versionen auch variable=`command`)<br />

3.4.3 Zugriff auf Variablen <strong>und</strong> Ausgabe der Werte<br />

Verbindung von Variablen: a=$a$a$a bzw. a=${a}26<br />

Ausgabe des Wertes mit echo $variable<br />

Ausgabe des Wertes <strong>und</strong> der Attribute einer bestimmten Variable: declare –p variable<br />

Ausgabe aller lokalen <strong>und</strong> globalen Shellvariablen: set oder declare (ohne Argumente)<br />

Auflistung der schreibgeschützten bzw. Integer-Variablen: declare –r oder declare –i<br />

Anzeige aller globalen Variablen: env, printenv, declare –x oder export<br />

8


3.4.4 Export von Variablen<br />

Überführung der lokalen in eine globale Variable erfolgt mittels<br />

export variable export var=value<br />

declare –x variable declare –x var=value<br />

3.4.5 Löschen <strong>und</strong> Zurücksetzen von Variablen<br />

Zurücksetzen von Variablen: variable=<br />

Löschen von Variablen: unset variable<br />

Schreibgeschützte Variable können nicht gelöscht werden<br />

3.4.6 Definition von Feldern<br />

Neuere Shells (bash <strong>und</strong> korn) ermöglichen die Definition von eindimensionalen Feldern<br />

• Zuweisung mit declare<br />

declare –a name<br />

name=(test1 test2 test3) oder in einem Schritt<br />

declare –a name=(val1 val2 val3)<br />

• Zuweisung von Werten zu einzelnen Feldelementen<br />

declare –a name<br />

name[i]=vali i,j=0, 1,..,N<br />

name[j]=valj<br />

Es gibt dabei keinen maximalen Wert für N <strong>und</strong> keine Festlegung, dass die Indizes<br />

kontinuierlich bezeichnet werden müssen.<br />

• Einlesen<br />

read –a name<br />

• Zugriff<br />

${name[index]}<br />

Index @ oder * steht für alle Indizes<br />

3.4.7 Berechnungen mit Variablen<br />

• Alte Shells (Bourne-, C-): Interpretation von String-Variablen als Zahlen mit dem<br />

expression-Kommando<br />

variable=$(expr expression) mit expression: arg1 operator arg2<br />

Operatoren: +, -, *, /, % (Punkt geht vor Strichrechnung, Klammern sind möglich,<br />

müssen aber quotiert werden Voransetzen des \)<br />

Beispiel:<br />

a=123; b=456<br />

c=$(expr $a + $b) Leerzeichen beachten, sonst Interpretation als String<br />

echo $c<br />

468<br />

• Neuere Shells (Bash, Korn): Deklaration als Integer-Variable oder Nutzung des let-<br />

Kommandos <br />

Beispiele:<br />

declare –i a; declare –i b<br />

a=3*2<br />

b=a<br />

echo $a $b<br />

6 6<br />

9


let “x=4“ “y=5“ “z=x*y“<br />

echo $x $y $z<br />

4 5 20<br />

Wenn nur ein Ausdruck folgt: $((expression)) oder $[expression]<br />

x=4; y=-5<br />

z=$[x*y+22]; echo $z<br />

2<br />

Beachte: $(command) Kommando ersetzen<br />

$[expression] Ausdruck bewerten<br />

${name} Referenziert eine Variable<br />

3.4.8 Kommando-Zeile <strong>und</strong> spezielle Parameter<br />

Kommandozeile:<br />

$0: Kommandoname<br />

$1, $2, ..$9: Argumente<br />

spezielle Variablen:<br />

$$: PID der aktuellen Shell<br />

$?: Rückgabewert des letzten Shell-Kommandos (0:ok, >0: Fehler)<br />

$#: Anzahl der Argumente<br />

$*: steht (als Parameter) für alle Positionsparameter (In Anführungszeichen steht ''$*''<br />

für ein einziges Wort, bestehend aus dem Inhalt aller Positionsparameter mit<br />

Leerzeichen als Trennzeichen.)<br />

$@: steht ebenfalls für alle Positionsparameter (In Anführungszeichen wird es durch die<br />

Werte der einzelnen Positionsparameter (jeweils ein einzelnes Wort) ersetzt.)<br />

3.4.9 Sonderzeichen als Parameter - Quotierung<br />

Quotierung wird zur Ausschaltung der speziellen Bedeutung von Kontrollzeichen,<br />

reservierten Wörtern oder Namen benutzt. So können Parameter an Funktionen übergeben<br />

werden, die Sonderzeichen, Namen oder reservierte Wörter enthalten. Die Shell nimmt in<br />

diesem Fall keine Veränderung an den Parametern vor.<br />

Es gibt drei Formen der Quotierung:<br />

1. durch das Fluchtsymbol \ (Backslash)<br />

2. durch Hochkomma ' (Quote)<br />

3. durch Anführungszeichen '' (Doublequote)<br />

Das Fluchtsymbol wirkt sich auf das unmittelbar folgende Sonderzeichen aus. Ein durch das<br />

Fluchtsymbol entwertetes Zeilenende wird ignoriert.<br />

Die in Hochkommata eingeschlossenen Wörter werden von der Shell nicht weiter bearbeitet.<br />

(Sonderfall: Ein Hochkomma darf in keinem Fall in Hochkommata eingeschlossen werden.)<br />

Von den in Anführungszeichen eingeschlossenen Wörtern erkennt die Shell nur die<br />

Sonderzeichen $, ' <strong>und</strong> \ als solche. Alle anderen Wörter bleiben unbearbeitet. Das<br />

Fluchtsymbol behält seine Bedeutung aber nur, wenn es von einem der Zeichen $ ' '' \ oder<br />

dem Zeilenende (RETURN) gefolgt wird. Ein Anführungszeichen darf zwischen zwei<br />

Anführungszeichen stehen, wenn es durch ein Fluchtsymbol eingeleitet wird.<br />

10


3.5 Shell-<strong>Script</strong>s<br />

• Shell <strong>Script</strong>: Sammlung von ein oder mehreren Shell-Kommandos <strong>und</strong><br />

Kontrollstrukturen<br />

• Verwendung von Shell-Variablen ermöglicht flexible <strong>und</strong> allgemeine Skripte<br />

• Shell arbeitet als Interpreter <strong>und</strong> nicht als Compiler<br />

• Erste Zeile eines Skripts: #!/path/shell z.B. #!/bin/sh<br />

• Aufruf eines Skripts<br />

es<br />

- mit einer Shell <br />

wird ein Kindsprozess generiert, in dem die <strong>Script</strong>-<br />

Kommandos ausgeführt werden; in dem Fall braucht das x-Schutzbit nicht<br />

gesetzt zu sein<br />

> sh –opt script arguments<br />

opt: -x: Anzeige der Kommandos, wenn sie ausgeführt werden,<br />

Markierung mit +, Ersetzung/Erweiterung der Argumente, wenn<br />

sie Wildcards oder Shell-Variable enthalten<br />

-v: Anzeige der Zeile im Skript, wenn die Shell sie liest,<br />

keine Erweiterung der Argumente<br />

-n: Anzeige der Kommandos, keine Ausführung<br />

-e: Abbruch des Skripts, wenn ein Befehl einen exit-Status hat<br />

- direkter Aufruf<br />

> script arguments oder abhängig vom Pfad > ./ script arguments<br />

x-Schutzbit muss gesetzt sein<br />

(Debug-Optionen können gesetzt werden, z.B. mit # set –xvne bzw.<br />

set +xvne <br />

Schritte bei der Interpretation einer Kommandozeile durch die Shell:<br />

1. Zerlegung des Kommandos anhand von Trennzeichen in atomare Sinneinheiten<br />

(Wörter <strong>und</strong> der Meta-Zeichen)<br />

2. Interpretation der einfachen Hochkommas <strong>und</strong> der Anführungszeichen<br />

3. Ersetzung der Aliase<br />

4. Ein- <strong>und</strong> Ausgabeumlenkung (, |) identifizieren<br />

5. Variable ersetzen ( $xxx )<br />

6. Ersetzen der Kommandos ( §(xxx) oder `xxx` )<br />

7. Dateinamenserweiterung ( * oder ? )<br />

3.5.1 Shift-Kommando<br />

• wenn die Anzahl der Argumente variiert, würden feste Variablennamen, wie $5 oder<br />

$9 sehr unflexibel sein<br />

• shift bewegt ein Argument von der Liste <strong>und</strong> verschiebt alle anderen um eine Zahl<br />

• Zurückverschiebung ist nicht möglich<br />

3.5.2 Set-Kommando<br />

• Neudefinition der Zuordnung der Argumente innerhalb des Skripts<br />

• Hilfreich in interaktiven <strong>Script</strong>s <strong>und</strong> für die Speicherung <strong>und</strong> Zuordnung der Ausgabe<br />

von Unix-Kommandos<br />

$1=w1,<br />

• Bsp.: set w1 w2 w3 <br />

> oldparams=“$*“<br />

> set something else<br />

... use the new arguments<br />

> set $oldparams<br />

$2=w2, $3=w3<br />

11


3.5.3 Bedingungsanweisungen<br />

if-Anweisung<br />

Syntax:<br />

if test-Kommando<br />

then<br />

Anweisungen # Ausführung wenn Test-Kommando 0 („true“) liefert<br />

[ elif test-Kommando<br />

then<br />

Anweisungen ]<br />

[ else<br />

Anweisungen # Ausführung wenn Test-Kommando 1 („false“) liefert ]<br />

fi<br />

Schreiben der Sequenz ist auch in eine Linie möglich:<br />

if test; then cmd1; else cmd2; fi<br />

Möglichkeiten des Test-Kommandos: test condition oder [ condition ] (Beachte: Leerzeichen<br />

zwischen Klammer <strong>und</strong> Bedingung)<br />

Bsp.: test –d file oder [ -d file ]<br />

case-Anweisung<br />

Syntax:<br />

case Zeichenkette in<br />

pat1 [ |pat2 ] .. ) Anweisungen ;;<br />

pat3 ) Anweisungen;;<br />

...<br />

patn ) Anweisungen ;;<br />

*) ansonsten ausgeführte Anweisungen;;<br />

esac<br />

Die case-Anweisung basiert auf dem Matching von Zeichen. Der | wird genutzt zur Separation<br />

verschiedener Ausdrücke genutzt.<br />

Die case-Anweisung ist schneller als die if-Anweisung, da hier nur Mustervergleiche anstatt<br />

einer Anweisung zur Ermittlung des Wahrheitswertes durchgeführt werden müssen.<br />

3.5.4 Schleifen<br />

for-schleife<br />

Syntax:<br />

for Variable [ in Wortliste ]<br />

do<br />

Anweisungen<br />

done<br />

Es existieren vier Möglichkeiten zur Definition der Laufvariablen in for-Schleifen:<br />

1. explizite Wörter-Liste (z.B. for person in Amalia Clara Maria)<br />

2. Wörter-Liste mit Kommando-Ersetzung (z.B. for file in $(ls))<br />

3. Wörter-Liste mit regulärem Ausdruck (z.B. for file in *.c)<br />

4. Wörter-Liste = Argumentliste (z.B. for i)<br />

12


Die for-Schleife kann als normales Kommando angesehen werden. Sie kann umgeleitet, mit<br />

anderen Kommandos gekoppelt oder im Hintergr<strong>und</strong> gestartet werden usw.<br />

while /until-Schleifen<br />

Syntax:<br />

while / until test-Kommando<br />

do<br />

Anweisungen<br />

done<br />

Die Anweisungen werden solange ausgeführt, bis das Test-Kommando einen exit-Status von<br />

0 (bei while) bzw. von 1 (bei until) hat.<br />

Die until-Schleife ist equivalent zu:<br />

while [ !Bedingung ]; do Anweisungen; done<br />

$data“<br />

Nutzung der while-Schleife in komplexen Anweisungen:<br />

> ls –l | while read data; do echo „ ; done<br />

> ls –l | while read data; do echo „ $data“ ; done | grep „watch“ <br />

3.5.5 Standardisierte Parameterübergabe mit der getopt-Funktion<br />

Herausfilterung von Optionen aus der Kommandozeileneingabe beim Aufruf von Shell-<br />

Skripten<br />

• getopts wird mit mindestens zwei Argumenten aufgerufen<br />

getopts OPTSTRING $*<br />

OPTSTRING: Zeichenkette, die alle zulässigen Optionszeichen enthält; folgt ein „:“, besitzt<br />

diese Option ein Argument (Angabe mit oder ohne Leerzeichen)<br />

$*: Kommandozeileneingabe beim Aufruf des Shell-<strong>Script</strong>s<br />

Der Index des nächsten zu verarbeitenden Arguments, das keine Option ist, ist in OPTIND<br />

gespeichert (Die Initialisierung von OPTIND erfolgt mit 1), wenn getopts beendet ist.<br />

3.6 Hilfsprogramme zur Textverarbeitung<br />

3.6.1 Durchsuchungsbefehl: grep<br />

- Heraussuchen <strong>und</strong> Anzeigen von bestimmten Zeichenketten aus einer oder mehreren<br />

Dateiinhalten; standardmäßig (wenn keine Optionen verwendet werden) erfolgt die<br />

Ausgabe der Zeilen mit der gesuchten Zeichenkette <strong>und</strong> des Dateinamens, falls mehrere<br />

Dateien durchsucht werden sollten<br />

- grep ist ein Filter mit der Standardeingabe stdin <strong>und</strong> der Standardausgabe stdout<br />

- der exit-Status ist 0, wenn die Zeichenkette in der Datei auftrat <strong>und</strong> 1 im anderen Fall<br />

- Syntax: grep [Optionen] Zeichen [Dateien]<br />

- Beachte: die Dateinamen werden durch die Shell vervollständigt (Wildcards) <strong>und</strong> die<br />

Zeichenkette wird von grep vervollständigt (reguläre Ausdrücke)<br />

- Zeichenkette in Anführungszeichen setzen, damit Shell das Muster nicht expandiert<br />

13


Reguläre Ausdrücke<br />

Allgemeine Regeln:<br />

- Reguläre Ausdrücke arbeiten nur innerhalb einer Zeile (\n als Linienende-Zeichen ist ein<br />

Trennzeichen <strong>und</strong> reguläre Ausdrücke untersuchen den Text zwischen zwei Trennzeichen)<br />

- Wenn ein regulärer Ausdruck mit mehr als einer Zeichenkette in der Zeile übereinstimmt,<br />

wird die längste genommen (im Fall gleicher Länge die erste)<br />

Es gibt drei bedeutende Teile bei einem regulären Ausdruck:<br />

- Anker zur Angabe der Position eines Zeichens<br />

o ^ Startanker für den Beginn einer Zeile<br />

o $ Endeanker für das Ende einer Zeile<br />

- Zeichenmengen<br />

o Einzelne Zeichen oder Angabe von alternativen Zeichen in eckigen Klammern<br />

o Ausschluss von Zeichen durch [^..] (anstatt [!..] bei Wildcards)<br />

o Beliebiges Zeichen: Angabe eines Punktes (anstatt ? bei Wildcards)<br />

erweiterte reguläre Ausdrücke (grep –E oder egrep)<br />

o Kombination komplexer Ausdrücke ist mit | (oder) möglich, wobei die<br />

Zeichen von Klammern umschlossen sind.<br />

- Modifikatoren für Wiederholungen<br />

o x*: ein Zeichen (x) 0- oder mehrmals<br />

erweiterte reguläre Ausdrücke (grep –E oder egrep)<br />

o x?: ein Zeichen (x) 0- oder 1-mal<br />

o x+: ein Zeichen (x) 1- oder mehrmals<br />

- Weitere Zeichen:<br />

o ^$: leere Zeile<br />

o ^text$: Zeile die nur angegebenen Text enthält<br />

o \: Wortende<br />

wichtige Optionen von grep:<br />

-h: unterdrücken der Dateianzeige<br />

-v: invertieren der Ausgabe (alle Zeilen, wo Zeichenkette nicht vorkommt)<br />

-w: Suchmuster stellt vollständiges Wort dar<br />

-i: Ignorieren von Groß- <strong>und</strong> Kleinschreibung<br />

-c: Zählen der Zeilen, aber keine Ausgabe<br />

Spezielle grep Metazeichen:<br />

[[:alnum:]] - alphanumerisches Zeichen<br />

[[:alpha:]] - Buchstabe (groß oder klein)<br />

[[:cntrl:]] - Control-Zeichen<br />

[[:digit:]] - Zahl<br />

[[:lower:]] - Kleinbuchstabe<br />

[[:upper:]] - Großbuchstabe<br />

[[:space:]] - Leerzeichen<br />

[^[:class:]] - Negation einer Zeichenklasse<br />

14


3.6.2 Ersetzungsbefehl - sed<br />

- sed ist ein nicht-interaktiver stream-orientierter Editor<br />

- sed transformiert eingehende Daten von der Standardeingabe durch Ausführung der<br />

eingegebenen Editor-Kommandos <strong>und</strong> sendet die transformierten Daten zur<br />

das<br />

Standardausgabe <br />

editierte File wird somit nicht geändert<br />

- sed-Kommandos sind global <strong>und</strong> werden auf alle Zeilen der Eingabedatei angewandt<br />

- Nutzung von sed ist sinnvoll<br />

o Durchführung von automatische Editieraufgaben in einer oder mehreren<br />

Dateien<br />

o Zeichenkonvertierungsaufgaben<br />

- Syntax: sed [Optionen] Editierkommando(s) [Eingabedatei(en)]<br />

wichtige Optionen von sed:<br />

-e: kennzeichnet jedes Editierkommando, wenn mehrere folgen<br />

-f: gibt an, dass der Dateiname eines <strong>Script</strong>s folgt, welches die Editierkommandos enthält<br />

Editierkommandos<br />

• Adressen: es können keine, eine oder zwei Adressen spezifiziert werden, um Zeilen zu<br />

definieren, in denen das Editieren erfolgen soll. Folgende Mechanismen können dabei<br />

benutzt werden:<br />

− Keine Angabe: alle Zeilen<br />

− Nummer: genau diese Zeile<br />

− Start, Ende: alle Zeilen von "Start" bis "Ende"<br />

− $: Symbolisiert die letzte Zeile<br />

− RegEx: Zeilen, die den Regulären Ausdruck enthalten (reguläre Ausdrücke müssen in<br />

Schrägstriche eingeschlossen sein)<br />

− 1, RegEx: von Zeile 1 bis zur ersten Zeile, die RegEx enthält<br />

• Kommandos:<br />

− s: Ersetzen der ersten durch die zweite Zeichenkette<br />

− d: Löschen von Zeilen<br />

− i: Einfügen von Text in die Ausgabedatei<br />

− a: Anhängen von Text an die Ausgabedatei<br />

− w: Schreiben der Änderungen in eine Datei<br />

− y: Zeichentausch (jedes Zeichen in der ersten Zeichenkette wird mit dem Zeichen an<br />

der entsprechenden Position in der zweiten Zeichenkette ersetzt<br />

− p: Ausgabe der Zeilen der Datei (in Verbindung mit Option –n)<br />

• Flags (vor allem für das Ersetzungskommando):<br />

− g: global (ersetzt alle Instanzen)<br />

− n: ersetzt die n-te Instanz<br />

− p: Ausgabe der Zeile nach stdout, wenn die Ersetzung erfolgreich war<br />

3.7 Zusammenfassung – Shellprogrammierung<br />

Vorteile von Shell-Programmen:<br />

− direktes Arbeiten: kein Kompilieren der Programme erforderlich schnelles Erstellen<br />

<strong>und</strong> Testen möglich<br />

− Portabilität der Programme<br />

− im Unterschied zum interaktiven Arbeiten im Kommandomodus: Unabhängigkeit von<br />

Programmerstellung <strong>und</strong> Nutzung<br />

− Erhöhung der Systemsicherheit indirekte Rechtevergabe<br />

<br />

15


Nachteile:<br />

− Leichtes kopieren <strong>und</strong> manipulieren der <strong>Script</strong>e möglich Programme liegen im<br />

Quelltext vor<br />

− Debuggen größerer Projekte ist schwierig<br />

− Interpreterprogramme Langsamkeit bei der Ausführung <br />

Typische Anwendungsbeispiele:<br />

− Kleine Hilfsprogramme, die eng mit den Unix-Kommandos verzahnt sind<br />

− Installationsprogramm, Setup-Programme, Konfigurationsprogramme<br />

− Einfache automatische Textverarbeitung<br />

− Komplexe Programmaufrufe je nach System für den einfachen Anwender erleichtern<br />

16

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!