3 UNIX und Linux: Benutzerschnittstelle, Script-Programmierung ...
3 UNIX und Linux: Benutzerschnittstelle, Script-Programmierung ...
3 UNIX und Linux: Benutzerschnittstelle, Script-Programmierung ...
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