|
Wie schon erwähnt, kann ein Shell-Skript beinahe alles, was eine richtige
Programmiersprache kann. Dazu stehen mehrere Mechanismen zur Verfügung.
Um den Umfang dieses Dokuments nicht zu sprengen, werden an dieser Stelle
nur die wichtigsten vorgestellt.
|
Zunächst soll die Frage geklärt werden, wie man überhaupt ein ausführbares
Shell-Skript schreibt. Dabei wird vorausgesetzt, dass dem Benutzer der
Umgang mit mindestens einem Texteditor ( vi, emacs
etc.) bekannt ist.
|
Zunächst muss mit Hilfe des Editors eine Textdatei angelegt werden, in die
der Quelltext geschrieben wird. Wie der aussieht, kann man
anhand der
folgenden Abschnitte und der Beispiele im Anhang erkennen. Beim
Schreiben sollte man nicht mit Kommentaren geizen, da ein Shell-Skript
auch schon mal sehr unleserlich werden kann.
Die Datei ist unter geeignetem Namen zu speichern.
Bitte hierfür nicht den Namen test verwenden. Es existiert ein
Unix-Systemkommando mit diesem Namen. Dieses steht fast immer eher im Pfad,
d. h. beim Kommando test würde nicht das eigene Skript
ausgeführt, sondern
das Systemkommando. Dies ist einer der häufigsten und zugleich einer der
verwirrendsten Anfängerfehler. Mehr zu dem test-Kommando
unter
Bedingungen
Danach muss sie ausführbar gemacht werden. Das geht mit dem
Unix-Kommando chmod.
Rechte werden unter Unix getrennt für den Benutzer (user,
u), die Gruppe
(group, g) oder Andere
(others, o) vergeben.
Außerdem kann man die Rechte für Gruppen zusammen (all,
a) setzen.
Man kann getrennt die Rechte für das Lesen (read,
r), das Schreiben
(write, w) und die Ausführung (execution,
x) einstellen. Um die Rechte zu
setzen, muss man chmod in Parametern mitgeben, auf wen sich
das
Kommando bezieht, ob das Recht gesetzt (+) oder weggenommen
(-) werden soll,
und welche Rechte gemeint sind. Damit alle Benutzer das Skript ausführen
dürfen, benutzt man das Kommando chmod ugo+x name
oder einfach chmod +x name. Mit
chmod u+x name hat nur der Besitzer der Datei
Ausführungsrechte.
Dann kann das Skript gestartet werden. Da sich aus Sicherheitsgründen
auf den meisten Systemen das aktuelle Verzeichnis nicht im Pfad des
Benutzers befindet, muss man der Shell mitteilen, wo sie zu suchen hat:
Mit ./name wird versucht, im aktuellen Verzeichnis
(./) ein Programm namens
name auszuführen.
Auf den meisten Systemen befindet sich im Pfad der Eintrag
~/bin bzw.
Bedingungen /home/benutzername/bin,
das bedeutet, dass man Skripte, die immer wieder
benutzt werden sollen, dort ablegen kann, so dass sie auch ohne eine
Pfadangabe gefunden werden. Wie der Pfad genau aussieht kann man an der Shell
durch Eingabe von echo $PATH herausfinden.
|
|
Wenn unter Unix ein Prozeß beendet wird, gibt er einen Rückgabewert (auch
Exit-Code oder Exit-Status genannt) an seinen aufrufenden Prozeß zurück.
So kann der Mutterprozeß kontrollieren, ob die Ausführung des
Tochterprozesses ohne Fehler beendet wurde. In einigen Fällen (z. B.
grep) werden unterschiedliche Exit-Codes für
unterschiedliche Ereignisse benutzt.
Dieser Rückgabewert wird bei der interaktiven Benutzung der Shell nur
selten benutzt. Aber in der Programmierung von Shell-Skripten ist er von
unschätzbarem Wert. So kann das Skript automatisch entscheiden, ob
bestimmte Aktionen ausgeführt werden sollen, die von anderen Aktionen
abhängen. Beispiele dazu sieht man bei der Beschreibung der Kommandos
if,
case,
while und
until, sowie in dem Abschnitt über
Befehlsformen.
In der Bourne-Shell wird der Exit-Code des letzten
aufgerufenen Programms
in der Variable $? abgelegt. Üblicherweise geben Programme
den
Wert 0 zurück, bei irgendwelchen Problemen einen von
0 verschiedenen Wert.
Das wird im folgenden Beispiel deutlich:
user@linux $
cp datei /tmp
user@linux $
echo $?
0
user@linux $
cp datie /tmp
cp: datie: Datei oder Verzeichnis nicht gefunden
user@linux $
echo $?
1
|
Normalerweise wird man den Exit-Code nicht in dieser Form abfragen.
Sinnvoller ist folgendes Beispiel, in dem eine Datei erst gedruckt, und
dann - falls der Ausdruck erfolgreich war - gelöscht wird:
user@linux $
lpr datei && rm datei
|
Näheres zur Verknüpfung von Aufrufen steht im Kapitel über
Befehlsformen. Beispiele zur Benutzung
von Rückgabewerten in
Schleifen finden sich im Anhang unter A.1.
Auch Shell-Skripte können einen Rückgabewert an aufrufende Prozesse
zurückgeben. Wie das geht, steht in dem Abschnitt zu exit.
|
|
|
In einem Shell-Skript hat man - genau wie bei der interaktiven Nutzung der
Shell - Möglichkeiten, über Variablen zu verfügen. Anders als in den meisten
modernen Programmiersprachen gibt es aber keine Datentypen wie Ganzzahlen,
Fließkommazahlen oder Strings. Alle Variablen werden als String gespeichert.
Wenn die Variable die Funktion einer Zahl übernehmen soll, dann muss
das verarbeitende Programm die Variable entsprechend interpretieren.
(Für arithmetische Operationen steht das Programm expr zur Verfügung,
siehe Zählschleifen-Beispiel unter while)
Man muss bei der Benutzung von Variablen sehr aufpassen, wann die
Variable expandiert wird und wann nicht. (Mit Expansion ist das Ersetzen
des Variablennamens durch den Inhalt gemeint). Grundsätzlich werden Variablen
während der Ausführung des Skriptes immer an den Stellen ersetzt, an denen
sie stehen. Das passiert in jeder Zeile, unmittelbar bevor sie ausgeführt
wird. Es ist also auch möglich, in einer Variable einen Shell-Befehl
abzulegen. Im Folgenden kann dann der Variablenname an der Stelle des
Befehls stehen. Um die Expansion einer Variable zu verhindern, benutzt
man das Quoting (siehe unter Quoting).
Wie aus diversen Beispielen hervorgeht, belegt man eine Variable, indem
man dem Namen mit dem Gleichheitszeichen einen Wert zuweist. Dabei darf
zwischen dem Namen und dem Gleichheitszeichen keine Leerstelle
stehen,
ansonsten erkennt die Shell den Variablennamen nicht als solchen und
versucht, ein gleichnamiges Kommando auszuführen - was meistens durch eine
Fehlermeldung quittiert wird.
Wenn man auf den Inhalt einer Variablen zugreifen möchte, leitet man
den Variablennamen durch ein $-Zeichen ein. Alles was mit
einem $ anfängt
wird von der Shell als Variable angesehen und entsprechend behandelt
(expandiert).
|
|
Es gibt eine Reihe von vordefinierten Variablen, deren Benutzung ein
wesentlicher Bestandteil des Shell-Programmierens ist.
Die wichtigsten eingebauten Shell-Variablen sind:
| $n |
Aufrufparameter mit der Nummer n, n <= 9 |
| $* |
Alle Aufrufparameter |
| $@ |
Alle Aufrufparameter |
| $# |
Anzahl der Aufrufparameter |
| $? |
Rückgabewert des letzten Kommandos |
| $$ |
Prozeßnummer der aktiven Shell |
| $! |
Prozeßnummer des letzten Hintergrundprozesses |
| ERRNO |
Fehlernummer des letzten fehlgeschlagenen Systemaufrufs |
| PWD |
Aktuelles Verzeichnis (wird durch cd gesetzt)
|
| OLDPWD |
Vorheriges Verzeichnis (wird durch cd gesetzt)
|
|
|
Unter Variablen-Substitution versteht man verschiedene Methoden um die
Inhalte von Variablen zu benutzen. Das umfaßt sowohl die einfache Zuweisung
eines Wertes an eine Variable als auch einfache Möglichkeiten zur
Fallunterscheidung. In den fortgeschritteneren Shell-Versionen
(bash, ksh)existieren sogar
Möglichkeiten, auf Substrings von Variableninhalten
zuzugreifen. In der Standard-Shell benutzt man für solche Zwecke
üblicherweise den Stream-Editor sed. Einleitende
Informationen dazu finden sich im Kapitel über die Mustererkennung).
Die folgenden Mechanismen stehen in der Standard-Shell bereit, um mit
Variablen zu hantieren. Bei allen Angaben ist der Doppelpunkt optional.
Wenn er aber angegeben wird, muss die Variable einen Wert enthalten.
| Variable = Wert |
Setzt die Variable auf den Wert. |
| ${Variable} |
Nutzt den Wert von Variable. Die Klammern müssen nicht mit
angegeben werden, wenn die Variable von Trennzeichen umgeben
ist.
|
| ${Variable:-Wert} |
Nutzt den Wert von Variable. Falls die Variable nicht
gesetzt ist, wird der Wert benutzt.
|
| ${Variable:=Wert} |
Nutzt den Wert von Variable. Falls die Variable nicht
gesetzt ist, wird der Wert benutzt, und Variable erhält
den Wert.
|
| ${Variable:?Wert} |
Nutzt den Wert von Variable. Falls die Variable nicht
gesetzt ist, wird der Wert ausgegeben und die Shell
beendet. Wenn kein Wert angegeben wurde, wird der Text
parameter null or not set ausgegeben.
|
| ${Variable:+Wert} |
Nutzt den Wert, falls die Variable gesetzt ist,
andernfalls nichts.
|
| $ h=hoch r=runter l= |
Weist den drei Variablen Werte zu, wobei l einen
leeren Wert erhält.
|
| $ echo ${h}sprung |
Gibt hochsprung aus. Die Klammern müssen gesetzt
werden, damit h als Variablenname erkannt werden kann.
|
| $ echo ${h-$r} |
Gibt hoch aus, da die Variable h belegt ist.
Ansonsten würde der Wert von r ausgegeben.
|
| $ echo ${tmp-`date`} |
Gibt das aktuelle Datum aus, wenn die Variable tmp
nicht gesetzt ist. (Der Befehl date gibt das Datum
zurück)
|
| $ echo ${l=$r} |
Gibt runter aus, da die Variable l keinen Wert
enthält. Gleichzeitig wird l der Wert von r
zugewiesen.
|
| $ echo $l |
Gibt runter aus, da l jetzt den gleichen Inhalt hat
wie r.
|
|
|
Dies ist ein sehr schwieriges Thema, da hier mehrere ähnlich aussehende
Zeichen völlig verschiedene Effekte bewirken. Unix unterscheidet allein
zwischen drei verschiedenen Anführungszeichen. Das Quoten dient dazu,
bestimmte Zeichen mit einer Sonderbedeutung vor der Shell zu 'verstecken'
um zu verhindern, dass diese expandiert (ersetzt) werden.
Die folgenden Zeichen haben eine spezielle Bedeutung innerhalb der Shell:
| ; |
Befehls-Trennzeichen
|
| & |
Hintergrund-Verarbeitung
|
| ( ) |
Befehls-Gruppierung
|
| | |
Pipe
|
| < > & |
Umlenkungssymbole
|
| * ? [ ] ~ + - @ ! |
Meta-Zeichen für Dateinamen
|
| ` ` (Backticks) |
Befehls-Substitution (Die Backticks erhält man
durch [shift] und die Taste neben dem Backspace.
|
| $ |
Variablen-Substitution
|
| [newline] [space] [tab] |
Wort-Trennzeichen
|
Die folgenden Zeichen können zum Quoten verwendet werden:
| " " (Anführungszeichen) |
Alles zwischen diesen Zeichen ist buchstabengetreu
zu interpretieren. Ausnahmen sind folgende Zeichen,
die ihre spezielle Bedeutung beibehalten: $ ` "
|
| ' ' (Ticks) |
Alles zwischen diesen Zeichen wird wörtlich
genommen, mit Ausnahme eines weiteren ' und
\.
(Die Ticks erhält man bei deutschen Tastaturen
durch die Taste neben dem Backspace -- ohne [shift].)
|
| \ (Backslash) |
Das Zeichen nach einem \ wird wörtlich genommen.
Anwendung z. B. innerhalb von " ", um
", $ und ` zu
entwerten. Häufig verwendet zur Angabe von
Leerzeichen (space) und Zeilenendezeichen, oder um
ein \-Zeichen selbst anzugeben.
|
Beispiele:
user@linux $
echo 'Ticks "schützen" Anführungszeichen'
Ticks "schützen" Anführungszeichen
user@linux $
echo "Ist dies ein \"Sonderfall\"?"
Ist dies ein "Sonderfall"?
user@linux $
echo "Sie haben `ls | wc -l` Dateien in `pwd`"
Sie haben 43 Dateien in /home/rschaten
user@linux $
echo "Der Wert von \$x ist $x"
Der Wert von $x ist 100
|
|
|
Bei der Angabe von Dateinamen können eine Reihe von Meta-Zeichen verwendet
werden, um mehrere Dateien gleichzeitig anzusprechen oder um nicht den vollen
Dateinamen ausschreiben zu müssen. (Meta-Zeichen werden auch Wildcards,
Joker-Zeichen oder Platzhalter genannt.)
Die wichtigsten Meta-Zeichen sind:
| * |
Eine Folge von keinem, einem oder mehreren Zeichen
|
| ? |
Ein einzelnes Zeichen
|
| [abc] |
Übereinstimmung mit einem beliebigen Zeichen in der Klammer
|
| [a-q] |
Übereinstimmung mit einem beliebigen Zeichen aus dem angegebenen Bereich
|
| [!abc] |
Übereinstimmung mit einem beliebigen Zeichen, das nicht in der Klammer ist
|
| ~ |
Home-Verzeichnis des aktuellen Benutzers
|
| ~name |
Home-Verzeichnis des Benutzers name
|
| ~+ |
Aktuelles Verzeichnis
|
| ~- |
Vorheriges Verzeichnis
|
| ls neu* |
Listet alle Dateien, die mit 'neu' anfangen
|
| ls neu? |
Listet 'neuX', 'neu4', aber nicht 'neu10'
|
| ls [D-R]* |
Listet alle Dateien, die mit einem Großbuchstaben zwischen D und R
anfangen (Natürlich wird in Shell-Skripten -- wie überall in der
Unix-Welt -- zwischen Groß- und Kleinschreibung unterschieden.)
|
|
|
Man unterscheidet in der Shell-Programmierung zwischen den Meta-Zeichen,
die bei der Bezeichnung von Dateinamen eingesetzt werden und den
Meta-Zeichen, die in mehreren Programmen Verwendung finden, um z. B.
Suchmuster zu definieren. Diese Muster werden auch reguläre Ausdrücke
(regular expression) genannt. Sie bieten wesentlich mehr Möglichkeiten als
die relativ einfachen Wildcards für Dateinamen.
In der folgenden Tabelle wird gezeigt, in welchen Unix-Tools welche Zeichen
zur Verfügung stehen. Eine ausführlichere Beschreibung der Einträge
findet sich danach.
|
ed |
ex |
vi |
sed |
awk |
grep |
egrep |
|
| . |
X |
X |
X |
X |
X |
X |
X |
Ein beliebiges Zeichen |
| * |
X |
X |
X |
X |
X |
X |
X |
Kein, ein oder mehrere Vorkommen des vorhergehenden Ausdrucks. |
| ^ |
X |
X |
X |
X |
X |
X |
X |
Zeilenanfang |
| $ |
X |
X |
X |
X |
X |
X |
X |
Zeilenende |
| \ |
X |
X |
X |
X |
X |
X |
X |
Hebt die Sonderbedeutung des folgenden Zeichens auf. |
| [ ] |
X |
X |
X |
X |
X |
X |
X |
Ein Zeichen aus einer Gruppe |
| \( \) |
X |
X |
|
X |
|
|
|
Speichert das Muster zur späteren Wiederholung. |
| \{ \} |
X |
|
|
X |
|
X |
|
Vorkommensbereich |
| \< \> |
X |
X |
X |
|
|
|
|
Wortanfang oder -ende |
| + |
|
|
|
|
X |
|
X |
Ein oder mehrere Vorkommen des vorhergehenden Ausdrucks. |
| ? |
|
|
|
|
X |
|
X |
Kein oder ein Vorkommen des vorhergehenden Ausdrucks. |
| | |
|
|
|
|
X |
|
X |
Trennt die für die Übereinstimmung verfügbaren Alternativen. |
| ( ) |
|
|
|
|
X |
|
X |
Gruppiert Ausdrücke für den Test. |
Bei einigen Tools (ex, sed und
ed) werden zwei Muster angegeben: Ein Suchmuster
(links) und ein Ersatzmuster (rechts). Nur die folgenden Zeichen
sind in einem Ersatzmuster gültig:
|
ex |
sed |
ed |
|
| \ |
X |
X |
X |
Sonderbedeutung des nächsten Zeichens aufheben. |
| \n |
X |
X |
X |
Verwendet das in \( \) gespeicherte Muster erneut.
|
| & |
X |
X |
|
Verwendet das vorherige Suchmuster erneut. |
| ~ |
X |
|
|
Verwendet das vorherige Ersatzmuster erneut. |
| \u \U |
X |
|
|
Ändert das (die) Zeichen auf Großschreibung. |
| \l \L |
X |
|
|
Ändert das (die) Zeichen auf Kleinschreibung. |
| \E |
X |
|
|
Hebt das vorangegangene \U oder \L auf.
|
| \e |
X |
|
|
Hebt das vorangegangene \u oder \l auf.
|
Sonderzeichen in Suchmustern:
| . |
Steht für ein beliebiges *einzelnes* Zeichen, mit Ausnahme
des Zeilenendezeichens.
|
| * |
Steht für eine beliebige (auch leere) Menge des einzelnen Zeichens
vor dem Sternchen. Das vorangehende Zeichen kann auch ein regulärer
Ausdruck sein. Beispielsweise steht .* für eine beliebige Anzahl
eines beliebigen Zeichens
|
| ^ |
Übereinstimmung, wenn der folgende Ausdruck am Zeilenanfang steht.
|
| $ |
Übereinstimmung, wenn der vorhergehende Azusdruck am Zeilenende steht.
|
| \ |
Schaltet die Sonderbedeutung des nachfolgenden Zeichens ab.
|
| [ ] |
Steht für *ein* beliebiges Zeichen aus der eingeklammerten Gruppe.
Mit dem Bindestrich kann man einen Bereich aufeinanderfolgender
Zeichen auswählen ([a-e]). Ein Zirkumflex (~) wirkt als Umkehrung:
[^a-z] erfaßt alle Zeichen, die keine Kleinbuchstaben sind.
Ein Bindestrich oder eine schließende eckige Klammer am Listenanfang
werden als Teil der Liste angesehen, alle anderen Sonderzeichen
verlieren in der Liste ihre Bedeutung.
|
| \( \) |
Speichert das Muster zwischen \( und \) in einem speziellen Puffer.
In einer Zeile können bis zu neun solcher Puffer belegt werden.
In Substitutionen können sie über die Zeichenfolgen \1 bis \9 wieder
benutzt werden.
|
| \{ \} |
Steht für den Vorkommensbereich des unmittelbar vorhergehenden
Zeichens. \{n\} bezieht sich auf genau n Vorkommen, \{n,\} auf
mindestens n Vorkommen und \{n,m\} auf eine beliebige Anzahl von
Vorkommen zwischen n und m. Dabei müssen n und m im Bereich zwischen
0 und 256 liegen.
|
| \< \> |
Steht für ein Zeichen am Anfang (\<) oder am Ende (\>) eines Wortes.
|
| + |
Steht für ein oder mehrere Vorkommen des vorhergehenden
regulären Ausdrucks = \{1,\}
|
| ? |
Steht für kein oder ein Vorkommen des vorhergehenden Ausdrucks.
= \{0,1\}
|
| | |
Übereinstimmung, wenn entweder der vorhergehende oder der
nachfolgende reguläre Ausdruck übereinstimmen.
|
| ( ) |
Steht für die eingeschlossene Gruppe von regulären Ausdrücken.
|
Sonderzeichen in Ersatzmustern:
| \ |
Hebt die spezielle Bedeutung des nächsten Zeichens auf.
|
| \n |
Ruft das n-te Muster aus dem Puffer ab (siehe oben, unter \( \).)
Dabei ist n eine Zahl zwischen 1 und 9.
|
| & |
Verwendet das vorherige Suchmuster erneut als Teil eines
Ersatzmusters.
|
| ~ |
Verwendet das vorherige Ersatzmuster erneut im momentanen
Ersatzmuster.
|
| \u |
Ändert das erste Zeichen des Ersatzmusters auf Großschreibung.
|
| \U |
Ändert alle Zeichen des Ersatzmusters auf Großschreibung.
|
| \l |
Ändert das erste Zeichen des Ersatzmusters auf Kleinschreibung.
|
| \L |
Ändert alle Zeichen des Ersatzmusters auf Kleinschreibung.
|
| \e |
Hebt das vorangegangene \u oder \l auf.
|
| \E |
Hebt das vorangegangene \U oder \L auf.
|
| Haus |
Die Zeichenfolge "Haus".
|
| ^Haus |
"Haus" am Zeilenanfang.
|
| Haus$ |
"Haus" am Zeilenende.
|
| ^Haus$ |
"Haus" als einziges Wort in einer Zeile.
|
| [Hh]aus |
"Haus" oder "haus"
|
| Ha[unl]s |
"Haus", "Hals" oder "Hans"
|
| [^HML]aus |
Weder "Haus", noch "Maus", noch "Laus",
dafür aber andere Zeichenfolgen, welche
"aus" enthalten.
|
| Ha.s |
Der dritte Buchstabe ist ein beliebiges Zeichen.
|
| ^...$ |
Jede Zeile mit genau drei Zeichen.
|
| ^\. |
Jede Zeile, die mit einem Punkt beginnt.
|
| ^\.[a-z][a-z] |
Jede Zeile, die mit einem Punkt und zwei Kleinbuchstaben beginnt.
|
| ^\.[a-z]\{2\} |
Wie oben, jedoch nur in grep und sed zulässig.
|
| ^[^.] |
Jede Zeile, die nicht mit einem Punkt beginnt.
|
| Fehler* |
"Fehle"(!), "Fehler", "Fehlers", etc.
|
| "Wort" |
Ein Wort in Anführunszeichen.
|
| "*Wort"* |
Ein Wort mit beliebig vielen (auch keinen)
Anführungszeichen.
|
| [A-Z][A-Z]* |
Ein oder mehrere Großbuchstaben.
|
| [A-Z]+ |
Wie oben, jedoch nur in egrep und awk zulässig.
|
| [A-Z].* |
Ein Großbuchstabe, gefolgt von keinem oder beliebig
vielen Zeichen.
|
| [A-Z]* |
Kein, ein oder mehrere Großbuchstaben.
|
| [a-zA-Z] |
Ein Buchstabe.
|
| [^0-9a-zA-Z] |
Symbole (weder Buchstaben noch Zahlen).
|
| [0-9a-zA-Z] |
Jedes alphanumerische Zeichen.
|
Beispiele: egrep- oder awk-Muster
| [567] |
Eine der /Zahlen 5, 6 oder 7.
|
| fuenf|sechs|sieben |
Eines der Worte fuenf, sechs oder sieben.
|
| 80[234]?86> |
"8086", "80286", "80386", "80486".
|
| F(ahr|lug)zeug |
"Fahrzeug" oder "Flugzeug"
|
|
Beispiele: ex- oder vi-Muster
|
| \<The |
Wörter wie "Theater" oder "Thema".
|
| ung\> |
Wörter wie "Teilung" oder "Endung".
|
| \<Wort\> |
Das Wort "Wort".
|
Beispiele: sed- oder grep-Muster
| 0\{5,\} |
Fünf oder mehr Nullen in Folge
|
| [0-9]-[0-9]\{3\}-[0-9]\{5\}-[0-9X] |
ISBN-Nummern in der Form n-nnn-nnnnn-n, das letzte Zeichen kann
auch ein X sein.
|
|
Beispiele: Suchen und Ersetzen mit sed und ex. Im Folgenden werden
Leerzeichen durch _ und Tabulatoren durch TAB gekennzeichnet. Befehle
für ex werden mit einem Doppelpunkt eingeleitet.
|
| s/.*/( & )/ |
Wiederholt die ganze Zeile, fügt aber Klammern hinzu.
|
| s/.*/mv & &.old/ |
Formt eine Wortliste (ein Wort pro Zeile) zu mv-Befehlen um.
|
| /^$/d |
Löscht Leerzeilen.
|
| :g/^$/d |
Wie oben, im ex-Editor.
|
| /^[_TAB]*$/d |
Löscht Leerzeilen und Zeilen, die nur aus Leerzeichen
oder Tabulatoren bestehen.
|
| :g/^[_TAB]*$/d |
Wie oben, im ex-Editor.
|
| / */ /g |
Wandelt ein oder mehrere Leerzeichen in ein Leerzeichen um.
|
| :%s/ */ /g |
Wie oben, im ex-Editor.
|
| :s/[0-9]/Element &:/ |
Wandelt (in der aktuellen Zeile) eine Zahl in
ein Label für ein Element um.
|
| :s |
Wiederholt die Substitution beim ersten Vorkommen.
|
| :& |
Wie oben.
|
| :sg |
Wie oben, aber für alle Vorkommen in einer Zeile.
|
| :&g |
Wie oben.
|
| :%&g |
Wiederholt die Substitution im ganzen Puffer.
|
| :.,$s/Wort/\U&/g |
Wandelt von der aktuellen bis zur letzten Zeile
das Wort Wort in Großschreibung um.
|
| :%s/.*/\L&/ |
Wandelt die gesamte Datei in Kleinschreibung um.
|
| :s/\<./\u&/g |
Wandelt den ersten Buchstaben jedes Wortes
in der aktuellen Zeile in Großschreibung um.
|
| :%s/ja/nein/g |
Ersetzt das Wort ja durch nein.
|
| :%s/Ja/~/g |
Ersetzt global ein anderes Wort (Ja) durch nein
(Wiederverwendung des vorherigen Ersatzmusters).
|
|
|
Bei der Shell-Programmierung verfügt man über ähnliche Konstrukte wie bei
anderen Programmiersprachen, um den Ablauf des Programms zu steuern.
Dazu gehören Funktionsaufrufe, Schleifen, Fallunterscheidungen und
dergleichen.
|
|
Kommentare in der Shell beginnen immer mit dem Nummern-Zeichen (#).
Dabei spielt es keine Rolle, ob das Zeichen am Anfang der Zeile steht, oder
hinter irgendwelchen Befehlen. Alles von diesem Zeichen bis zum Zeilenende
(bis auf eine Ausnahme - siehe unter Auswahl der Shell).
|
|
In der ersten Zeile eines Shell-Skriptes sollte definiert werden, mit welcher
Shell das Skript ausgeführt werden soll. Das System öffnet dann eine Subshell
und führt das restliche Skript in dieser aus.
Die Angabe erfolgt über eine Zeile in der Form #!/bin/sh, wobei unter
/bin/sh die entsprechende Shell (in diesem Fall die
Bourne-Shell) liegt.
Dieser Eintrag wirkt nur dann, wenn er in der ersten Zeile des Skripts steht.
|
|
Der Source-Befehl wird in der Form . skriptname angegeben. Er bewirkt
ähnliches wie ein #include in der Programmiersprache C.
Die Datei (auf die das Source ausgeführt wurde) wird eingelesen und ausgeführt,
als ob ihr Inhalt
an der Stelle des Befehls stehen würde. Diese Methode wird zum Beispiel
während des Bootvorgangs in den Init-Skripten benutzt, um immer wieder
benötigte Funktionen (Starten eines Dienstes, Statusmeldungen auf dem
Bildschirm etc.) in einer zentralen Datei pflegen zu können (siehe Beispiel
unter Ein typisches Init-Skript).
|
|
Es ist in der Shell auch möglich, ähnlich wie in einer 'richtigen'
Programmiersprache, Funktionen zu deklarieren und zu benutzen. Da die
Bourne-Shell (sh)
nicht über Aliase verfügt, können einfache Funktionen als Ersatz
dienen. Mit dem Kommando exit hat man die
Möglichkeit, aus einer Funktion einen Wert zurückzugeben.
|
Beispiel: Die Funktion gibt die Anzahl der Dateien im aktuellen Verzeichnis
zurück. Aufgerufen wird diese Funktion wie ein Befehl, also einfach durch
die Eingabe von count.
|
|
countfunction.sh
|
count () {
ls | wc -l # ls: Liste aller Dateien im Verzeichnis
# wc: Word-Count, zählt Wörter
}
|
|
|
Da die Standard-Shell keine arithmetischen oder logischen Ausdrücke
auswerten kann, muss dazu ein externes Programm benutzt werden. (if und
Konsorten prüfen nur den Rückgabewert eines aufgerufenen Programmes --
0 bedeutet true, alles andere
bedeutet false, siehe auch Rückgabewerte) Dieses
Programm heißt test. Üblicherweise besteht auf allen Systemen auch noch
ein Link namens [ auf dieses Programm. Dieser Link ist absolut gleichwertig
zu benutzen. Dementsprechend ist es auch zwingend erforderlich, nach
der Klammer ein Leerzeichen zu schreiben. Das dient dazu, Bedingungen in
if-Abfragen u. ä. lesbarer zu machen. Um dieses Konzept der Lesbarkeit
zu unterstützen, sollte man diese öffnende Klammer auch wieder schließen
(obwohl das nicht zwingend nötig ist).
Das test-Programm bietet sehr umfangreiche Optionen an. Dazu gehören
Dateitests und Vergleiche von Zeichenfolgen oder ganzen Zahlen. Diese
Bedingungen können auch durch Verknüpfungen kombiniert werden.
Dateitests:
| |