Vorlesung "UNIX"

von Prof. Jürgen Plate

10 Kommandoreferenz

10.1 vi Short Quick Reference Guide

vi-Kurzreferenz

Der Editor vi ('vi' steht für 'visual') ist ein bildschirmorientierter Editor, d. h. der Text ist in seiner aktuellen Version auf dem Bildschirm zu sehen. Es werden hier nur die wichtigsten Kommandos für Einsteiger aufgeführt. Aufruf:

vi Dateiname

Ist die Datei vorhanden, wird sie in den Editorpuffer geladen, andernfalls wird sie neu angelegt. Nach dem Aufruf des vi befindet sich der Benutzer im Kommandomodus. Die Arbeit spielt sich in zwei Ebenen ab.

Kommandomodus:
Freies Positionieren des Cursors innerhalb des Textes, Umsetzen von Textblöcken, Schreiben und Lesen von Dateien, Löschen von Textblöcken und Aufruf von UNIX-Kommandos.
Eingabemodus:
Einfügen von Text oder Überschreiben vorhandener Textpassagen.
Das Umschalten zwischen den Modi erfolgt mit der ESC-Taste.

Cursor-Bewegung (falls die Cursortasten nicht das Gewünschte tun)


         k
         ↑
      h ← → l
         ↓
         j
Die Handhabung des Kommandomodus des vi macht die Bedienung für den Anfänger etwas ungewohnt. Die Cursorpositionierung erfolgt mit verschiedenen Tasten, für die Eingabe von Dateibefehlen oder anderen Funktionen (z. B. Suchen/Ersetzen) ist die Eingabe eines Doppelpunktes nötig. Man befindet sich dann in ex-Modus, der ähnliche Eigenschaften hat, wie der (--> ed).
Bleiben wir gleich bei den ex-Befehlen. Nach der Eingabe des ':' springt der Cursor in die letzte Zeile und erlaubt die Eingabe eines ex-Befehls, der mit der Return-Taste abgeschlossen wird. Es sind nach dem Doppelpunkt alle ed-Befehle möglich. Für den Einstieg genügen:

:wq        Text auf die Platte schreiben und vi beenden.
ZZ         Text auf die Platte schreiben und vi beenden.
:w         Text auf Platte schreiben.
:w Datei   Text auf die angegebenen Datei schreiben.
:w>>Datei  Text an die angegebene Datei anhängen.
:x         wie :wq.
:q         Abbrechen, ohne den Text auf Platte zu schreiben.
:q!        Abbrechen, ohne den Text auf Platte zu schreiben. 
:r Datei   Text aus der angegebenen Datei nach der momentanen
           Zeile einfügen.
:e Datei   Neue Datei bearbeiten

Umschalten in den Eingabemodus:

a          (append) Eingabe rechts vom Cursor
A          Eingabe am Zeilenende
i          (insert) Engabe links vom Cursor
I          Eingaben am Zeilenanfang
o          Eingabe in der folgenden Zeile, Spalte 1.
O          Eingabe in der vorhergehenden Zeile, Spalte 1.
Der Eingabemodus wird durch Drücken der ESC-Taste verlassen. Wenn es die Hardware ermöglicht, ändert sich die Form des Cursors beim Wechsel zwischen Eingabe- und Kommandomodus.
Blättern auf dem Bildschirm können Sie mit folgenden Tastenkombinationen:

CTRL-F     Eine Bildschirmseite vorwärts
CTRL-B     Eine Bildschirmseite rückwärts
CTRL-D     Eine halbe Bildschirmseite vorwärts
CTRL-L     Bildschirm neu aufbauen (wenn z.B. eine Nachricht kam)

Cursorpositionierung (im Kommandomodus):
Normalerweise ist der vi an die Pfeiltasten der Tastatur richtig angepaßt. Daneben gibt es noch folgende Möglichkeiten (Auswahl):

h          Zeichen links (auch Backspace)
l          Zeichen rechts (auch blank)
k          Spalte höher
j          Spalte tiefer
b          Wortanfang
e          Wortende
w          Anfang nächstes Wort
H          Anfang erste Zeile des Bildschirms
L          Anfang letzten Zeile des Bildschirms
0          (Null) Zeilenanfang
$          Zeilenende
RETURN     nächste Zeile
nG         (Go) Gehe zu Zeile n. n ist eine Zeilennummer.
           Fehlt die Zahl, wird zur letzten Zeile der 
           Datei gesprungen.

Löschen von Text (im Kommandomodus) und Text ändern. Die Änderungskommandos wechseln automatisch in den Eingabemodus, der mit der ESC-Taste verlassen werden muß.

x          Zeichen unter dem Cursor löschen
X          Zeichen vor dem Cursor löschen
dw         ab Cursorpos. bis Wortende löschen
db         ab Cursorpos. bis Wortanfang löschen
dd         ganze Zeile löschen
r          Zeichen ersetzen (kein Abschluß mit ESC)
R          Mehrere Zeichen ersetzen
s          Ein Zeichen ersetzen und zusätzliche Zeichen
           anschließend einfügen
cc         Gesamte Zeile ändern
cw         Wort ändern

Suchen nach Zeichen oder Strings. Außer 'fx' und 'Fx' müssen die Suchkommandos mit der Return-Taste abgeschlossen werden.

fx         Zeichen 'x' in der momentanen Zeile suchen (vorwärts)
Fx         Zeichen 'x' in der momentanen Zeile suchen (rückwärts)
/str       String 'str' vorwärts in der Datei suchen
?str       String 'str' rückwärts in der Datei suchen
//         Letzten Suchbefehl wiederholen (vorwärts)
??         Letzten Suchbefehl wiederholen (rückwärts)

Sonstige Kommandos:

J          Zeilen verbinden (nächste Zeile anhängen)
u          Letzten Befehl rückgängig machen
U          Aktuelle Zeile wiederherstellen
.          Letztes Kommando wiederholen

10.2 Liste der Meta-Zeichen in regulären Ausdrücken

Wirkung Dateinamen-Expandierung awk, egrep sed, ed, grep, csplit, pg, more ex, vi
ein beliebiges Zeichen ? . . .
beliebige Zeichenkette * .* .* .*
vorhergehendes Zeichen

0 mal, 1 mal oder mehrmals
  * * *
1 mal oder mehrmals   + \ { 1, } \  
0 mal oder 1 mal   ? \ { 0,1 } \  
genau n mal     \ { n\ }  
n bis m mal     \ { n,m\ }  
mindestens n mal     \ { n,\ }  
aus der Menge 1) [...] [...] [...] [...]
... aus der Komplementärmenge [! ...] [ ^ ...] [ ^ ...] [ ^ ...]
Ausdruck nur am Zeilenanfang suchen   ^Ausdr. ^Ausdr. ^Ausdr.
Ausdruck nur am Zeilenende suchen   Ausdr.$ Ausdr.$ Ausdr.$
Zeichenfolge am Wortanfang suchen abc*     \<Ausdr.
Zeichenfolge am Wortende suchen *abc     Ausdr.\>
logisches Oder (Disjunktion)   A1 | A2    

1) Klammern können enthalten:

Wiederholungs-Operatoren

(Quantifier) beschreiben, wie oft eine bestimmte Zeichenfolge erkannt werden soll. Sie werden zusammen mit Zeichen-Erkennungsmustern eingesetzt, um nach mehreren Zeichen zu suchen. Achtung: Je nach Programm werden die Operationen verwendet bzw. ignoriert; man sollte also einen Blick in die Dokumentation werfen.

Operator Beschreibung Beispiel Ergebnis
? Passt auf ein beliebiges Zeichen einmal, sofern es vorhanden ist egrep "?erd" sample.txt Erkennt "berd", "herd" etc. und "erd"
* Erkennt das vorstehende Element mehrfach, sofern es vorhanden ist egrep "n.*rd" sample.txt Erkennt "nerd", "nrd", "neard" etc.
+ Erkennt das vorstehende Element ein- oder mehrmals egrep "[n]+erd" sample.txt Erkennt "nerd", "nnerd" etc., aber nicht "erd"
{n} Erkennt das vorstehende Element genau n-mal egrep "[a-z]{2}erd" sample.txt Erkennt "cherd", "blerd" etc., aber nicht "nerd", "erd", "buzzerd" etc.
{n,} Erkennt das vorstehende Element mindestens n-mal egrep ".{2,}erd" sample.txt Erkennt "cherd" und "buzzerd", aber nicht "nerd"
{n, N} Erkennt das vorstehende Element mindestens n-mal, aber höchstens N-mal egrep "n[e]{1,2}rd" sample.txt Erkennt "nerd" und "neerd"

Anker

Diese beschreiben, wo das Muster erkannt werden soll. Sie sind nützlich, wenn man nach gemeinsamen Zeichenkombinationen sucht.

Operator Beschreibung Beispiel Ergebnis
^ Passt auf den Anfang einer Zeile S/^/rhabarber / Fügt "rhabarber " am Anfang der Zeile ein
$ Passt auf das Ende einer Zeile S/$/ rhabarber/ Fügt " rhabarber" am Ende der Zeile ein
\< Erkennt den Anfang eines Wortes S/\</rhabarber/ Fügt "rhabarber" am Anfang des Wortes ein
    egrep "\<rhabarber" sample.txt Erkennt "rhabarberkuchen" etc.
\> Erkennt das Ende eines Wortes S/\>/rhabarber/ Fügt "rhabarber" am Ende des Wortes ein
    egrep "\>rhabarber" sample.txt Erkennt "laberrhabarber" etc.
\b Passt am Anfang oder Ende eines Wortes egrep "\brhabarber" sample.txt Erkennt "rhabarberkuche" und "laberrhabarber"
\B Passt in der Mitte eines Wortes egrep "\Brhabarber" sample.txt Erkennt "laberhabarbercake" etc.

Posix-Klassen

In vielen neueren Implementationen können innerhalb der eckigen Klammern nach POSIX auch Klassen angegeben werden, die selbst wieder eckige Klammern enthalten. Sie lauten beispielsweise:

[:alnum:]    Alphanumerische Zeichen: [:alpha:] und [:digit:].
[:alpha:] Buchstaben: [:lower:] und [:upper:].
[:blank:] Leerzeichen und Tabulator.
[:cntrl:] Steuerzeichen. Bei ASCII sind das die Zeichen 00 bis 1F, und 7F (DEL).
[:digit:] Ziffern: 0, 1, 2,... bis 9.
[:graph:] Graphische Zeichen: [:alnum:] und [:punct:].
[:lower:] Kleinbuchstaben1: nicht notwendigerweise nur von a bis z.
[:print:] Druckbare Zeichen: [:alnum:], [:punct:] und Leerzeichen.
[:punct:] Zeichen wie: ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~ .
[:space:] whitespace: Horizontaler und vertikaler Tabulator, Zeilen- und Seitenvorschub, Wagenrücklauf und Leerzeichen.
[:upper:] Großbuchstaben1: nicht notwendigerweise nur von A bis Z.
[:xdigit:] Hexadezimale Ziffern: 0 bis 9, A bis F, a bis f.

1Was Buchstaben sind, ist im Allgemeinen locale-abhängig.

Vordefinierte Zeichenklassen

Es gibt vordefinierte Zeichenklassen, die allerdings nicht von allen Implementierungen unterstützt werden, da sie lediglich Kurzformen sind und auch durch eine Zeichenauswahl beschrieben werden können. Wichtige Zeichenklassen sind:

10.3 Tabellen zur Shell-Programmierung

Befehlsmöglichkeiten

; es können mehr als ein Befehl in einer Zeile untergebracht werden, vorausgesetzt die Befehle werden durch den Strichpunkt getrennt
& gibt man einen Befehl gefolgt von dem Et-Zeichen (&) ein, so wird dieser Befehl im Hintergrund ausgeführt, der Befehl nimmt also das Terminal nicht in Anspruch und man kann in dieser Zeit weiterarbeiten; die Standardausgabe dieses Befehls erscheint trotzdem am Bildschirm; wird ein Befehl in den Hintergrun¦d geschickt, gibt das UNIX-System automatisch eine Nummer, die Prozeßindentifikationsnummer (siehe ps und kill), dieses Befehls aus.

Shell-Variablen

Variable Bedeutung
$0 Dateiname des Scripts
$1 - $9 Kommandozeilenparameters #1 - #9
$# Anzahl der Kommandozeilenparameter
$* Alle Kommandozeilenparameter (als einzelne Worte) *
$@ Alle Kommandozeilenparameter (Quotierung blebt erhalten)
${#*} Anzahl der Kommandozeilenparameter
${#@} Anzahl der Kommandozeilenparameter
$? Rückgabewert
$$ Prozessnummer (PID) des Scripts
$- Übergebene Flags an das Script (set-Befehl)
$_ Letztes Argument des vorherigen Kommmandos
$! Processnummer (PID) des zuletzt gestarteten Hntergrundprozesses
* Muss quotiert werden, andernfalls ist der Defaultwert $@.

Wildcards

* das Sternchen steht für die Namen (Zeichen) aller Dateien des Verzeichnisses, es kann am Anfang, in der Mitte oder am Ende eines Dateinamens plaziert werden
? das Fragezeichen ist Stellvertreter für genau ein Zeichen
[...] eine Liste von Zeichen, die erlaubt sein können, werden in eckigen Klammern angegebnen, das erste Zeichen muß allerdings kleiner sein bzw. weiter vorn im Alphabet liegen als das letzte Zeichen; Beispiele: [abc], [123], [0-9], [a-z], aber nicht gültige Substitution: [z-f], [5-1]
[!...] ist das erste Zeichen nach der öäffnenden Klammer ein Ausrufezeichen, so wird dadurch der Sinn der Übereinstimmungsprüfung umgekehrt;
Beispiel: [!a-z] = Übereinstimmung mit allen Zeichen ausgenommen Kleinbuchstaben
[...]*[...] mischt der Wertebereich mit anderen Zeichen; Beispiele:
[a-np-z]* alle Kleinbuchstaben außer o
[a-z]*[!0-9] alle Dateien, die mit einem Kleinbuchstaben beginnen und nicht mit einer Zahl enden

Quotings

"   " Keine Ersetzung der Metazeichen * ? [ ], jedoch Ersetzung von Shellvariablen (siehe unten) und Ersetzung durch die Ergebnisse von Kommandos (Backquote). Auch \ funktioniert weiterhin. Dazu ein Beispiel:
echo Der * wird hier durch alle Dateinamen ersetzt
echo "Der * wird hier nicht ersetzt"
'   ' Das einfache Anführungszeichen unterdrückt jede Substitution. Zum Beispiel:
echo 'Weder * noch `pwd` werden ersetzt'
`   ` Zwischen Backquote (Accent Grave) gesetzte Kommandos werden ausgeführt und das Ergebnis wird dann als Parameter übergeben (d. h. die Ausgabe des Kommandos landet als Parameter in der Kommandozeile). Dabei werden Zeilenwechsel zu Leerzeichen. Braucht dieses Kommando Parameter, tritt die normale Parameterersetzung in Kraft. Zum Beispiel:
echo "Aktuelles Verzeichnis: `pwd`"

Weil die verschiedenen Quotes manchmal schwer zu unterscheiden sind, wurde bei der bash eine weitere Möglichkeit eingeführt. Statt in Backquotes wird die Kommandofolge in $( ... ) eingeschlossen., z. B.:
echo "Aktuelles Verzeichnis: $(pwd)"

Eingabeumleitung

< Umlenken des Standardeingabe
> Umlenken der Standardausgabe zum Erzeugen / Überschreiben einer Datei
>> Umlenken der Standardausgabe zum Erzeugen / Anhängen einer Datei
<< Umlenken der Standardeingabe vom folgenden Text
n< öffne für Eingabe von Datei-Deskriptor n
n> öffne für Ausgabe von Datei-Deskriptor n (Überschreiben)
n>> öffne für Ausgabe von Datei-Deskriptor n (Anhängen)
n<< öffne für Eingabe von Datei-Deskriptor n des folgenden Textes
<&n verbinde Standardeingabe mit offener Datei in Datei-Deskriptor n
<&- schließe Standardeingabe
>&n verbinde Standardausgabe mit offener Datei in Datei-Deskriptor n
>&- schließe Standardausgabe
n<&m verbinde für die Eingabe Datei-Deskriptor n mit Datei-Deskriptor m
n<&- schließe Datei in Datei-Deskriptor n
n>&m verbinde für die Ausgabe Datei-Deskriptor n mit Datei-Deskriptor m
n>&- schließe Datei in Datei-Deskriptor n
Befehl 2> file alle Fehlermeldungen, die normalerweise zur Standardfehlerausgabe gelangen würden, werden jetzt in die Datei file umgeleitet

pipes

| die Pipe (|) verbindet zwei Unix-Befehle miteinander, die Ausgabe des einen Befehls ist die Eingabe für den anderen Befehl; dazu muß es zwischen den betreffenden Befehlen plaziert werden; Beispiel: who | more, seitenweises Auflisten der eingeloggten user; who | wc -l, erstellt eine detaillierte Liste der eingeloggten user

Ausdrücke beim test-Kommando

Eigenschaften von Dateien

Ausdruck Bedeutung
-e < datei > datei existiert
-r < datei > datei existiert und Leserecht
-w <datei> datei existiert und Schreibrecht
-x <datei> datei existiert und Ausführungsrecht
-f <datei> datei existiert und ist einfache Datei
-d <datei> datei existiert und ist Verzeichnis
-h <datei> datei existiert und ist symbolisches Link
-c <datei> datei existiert und ist zeichenor. Gerät
-b <datei> datei existiert und ist blockor. Gerät
-p <datei> datei existiert und ist benannte Pipe
-u <datei> datei existiert und für Eigentümer s-Bit gesetzt
-g <datei> datei existiert und für Gruppe s-Bit gesetzt
-k <datei> datei existiert und t- oder sticky-Bit gesetzt
-s <datei> datei existiert und ist nicht leer
-L <datei> datei ist symbolisches Link
-S Datei ist ein Socket
-t <datei> datei ist einem Terminal zugeordnet
-O Der User ist Eigentümer der Datei
-G Group id der Datei ist die eigene Gruppe
F1 -nt F2 Datei F1 is neuer als Datei F2 *
F1 -ot F2 Datei F1 is älter als Datei F2 *
F1 -ef F2 Dateien F1 und F2 sind hard links auf die gleiche Datei *
! NOT (invertiert die Bedeutung der obigen Tests)

Vergleiche und logische Verknüpfungen

Arithmetikvergleich Stringvergleich
Operator Bedeutung Operator Bedeutung
-eq gleich   =     == gleich
-ne ungleich   != ungleich
-lt kleiner   \< kleiner (ASCII) *
-le kleinergleich   \> größer (ASCII) *
-gt größer   -z String ist leer
-ge größergleich   -n String ist nicht leer
Arithmetikvergleich innerhalb von (( ... ))      
> größer      
>= größergleich      
< kleiner      
<= kleinergleich      
* Beim Vergleich innerhalb doppelter eckiger Klammern [[ ... ]] ist der Backslash \ nicht nötig.

Parameter-Substitution und -Expansion

Ausdruck Bedeutung
${var} Wert von var (dasselbe wie $var)
${var-$DEFAULT} Wenn var nicht existiert, liefert der Ausdruck $DEFAULT, andernfalls den Wert von var.
${var:-$DEFAULT} Wenn var nicht existiert oder leer ist, liefert der Ausdruck $DEFAULT, andernfalls den Wert von var.
${var=$DEFAULT} Wenn var nicht existiert, liefert der Ausdruck $DEFAULT, andernfalls den Wert von var.
${var:=$DEFAULT} Wenn var nicht existiert oder leer ist, liefert der Ausdruck $DEFAULT, andernfalls den Wert von var.
${var+$OTHER} Wenn var existiert, liefert der Ausdruck $OTHER, andernfalls einen leeren String.
${var:+$OTHER} Wenn var existiert, liefert der Ausdruck $OTHER, andernfalls einen leeren String.
${var?$ERR_MSG} Wenn var nicht existiert, wird $ERR_MSG ausgegeben und das Script mit Rückgabewert 1 beendet, andernfalls gibt es den Wert von var.
${var:?$ERR_MSG} Wenn var nicht existiert, wird $ERR_MSG ausgegeben und das Script mit Rückgabewert 1 beendet, andernfalls gibt es den Wert von var.
${!varprefix*} Deckt sich mit allen vorher definierten Variablen, die mit varprefix beginnen.
${!varprefix@} Deckt sich mit allen vorher definierten Variablen, die mit varprefix beginnen.

Klammern

Ausdruck Interpretation
Eckige Klammern
if [ CONDITION ] Test auf eine Bedingung
if [[ CONDITION ]] Erweiterter Test auf eine Bedingung
[a-z] Bereich von Zeichen in einem regulären Ausdruck (sed, grep, ...)
Geschweifte Klammern
${variable} Parametersubstitution
${!variable} Indirekte Variablenreferenz
{ command1; command2; . . . commandN; } Block von Kommandos
{} Textersetzung, z.B. bei find und xargs
Runde Klammern
( command1; command2 ) Block von Kommandos, die in einer Subshell ausgeführt werden
Array=(element1 element2 element3) Array-Initialisierung
result=$(COMMAND) Kommandosubstitution, neue Schreibweise
>(COMMAND) Prozess-Substitution
<(COMMAND) Prozess-Substitution
var=$(( 20 + 5 )) Integer-Arithmetik, Zuweisung an Variable
(( var0 = var1<98?9:21 )) Bedingter Ausdruck

Bash-Spezialitäten

Die Bash ist vollständig kompatibel zu der originalen Bourne-Shell, wurde aber erweitert. Im Verlauf des ersten Aufrufs arbeitet jede Shell zunächst die Datei /etc/profile ab, in der für alle Anwender gültige Kommandos und Variablen eingetragen sind. Daran anschließend sucht die Bash nach einer der folgenden Dateien im Heimatverzeichnis des Benutzers und führt diejenige aus, die zuerst gefunden wird:
  1. .bash\_profile
  2. .bash\_login
  3. .profile
Anders verhält es sich jedoch, wenn die Bash nicht als Login-Shell gestartet wird. Dann führt sie ausschließlich die Datei .bashrc aus. Die Ausführung der Dateien lässt sich über zwei Kommandozeilen-Parameter steuern:

Der Prompt

Die Bash gibt einen Eingabe-Prompt aus, häufig in der Form Username:Pfad$. Der Prompt ist über die Umgebungsvariable PS1 konfigurierbar. Ein Prompt in der oben genannten Form resultiert aus der Einstellung
PS1=\u:\w\$
Um andere Einstellungen auszuprobieren, müssen Sie die Variable neu belegen. Innerhalb dieser Einstellungen können Sie folgende Metazeichen verwenden:
\h Rechnername ohne Domäne
\H Vollständiger Rechnername
\t Aktuelle Uhrzeit
\u User-Name
\w Aktuelles Verzeichnis
\# Fortlaufende Nummer des aktuellen Befehls
\\ das Zeichen \
\$ # für root, $ für normale User

Editieren der Kommandozeile

Zum Bearbeiten der aktuellen Kommandozeile stehen sowohl Emacs- als auch vi-kompatible Editiermodi zur Verfügung. Voreingestellt ist der Emacs-Modus. Der vi-Modus kann durch set -o vi eingestellt werden, zurück in den Emacs-Modus kommt man mit set -o emacs. Die folgende Tabelle stellt die wichtigsten Editierfunktionen des Emacs-Modus zusammen:

[→] und [←] bewegen den Cursor in der Kommandozeile
[Esc] [F] springt zum nächsten Wortende
[Esc] [B] springt zum vorigen Wortanfang
[Strg]+[E] springt zum Zeilenende
[Strg]+[A] springt zum Zeilenanfang
[Strg]+[K] löscht den Text ab der Cursorposition bis zum Ende der Zeile
[Strg]+[Y] fügt den zuletzt gelöschten Text nach der Cursorposition ein
[Tab] ergänzt ein Eingabefragment zum passenden Dateinamen.

Ist bei [Tab] die Ergänzung nicht eindeutig möglich, ertönt ein Signalton und Sie erhalten durch zweimaliges Drücken der [Tab]-Taste eine Liste der in Frage kommenden Dateinamen.

Abhängig von der eingesetzten Terminalemulation können Sie Kombinationen mit der [Esc]-Taste oft auch mit der [Alt]-Taste nachbilden. Statt nacheinander [Esc] und [F] zu drücken, funktioniert meist auch die Kombination [Alt]+[F].

History-Mechanismus

In der Bash können Sie nicht nur die aktuelle Kommandozeile editieren, sie speichert auch alle zuvor eingegebenen Befehle in einer Datei, der sogenannten Kommandozeilen-History. Auch diese Datei befindet sich im home-Directory des Benutzers und heißt .bash\_history. Die Anzahl der Befehlszeilen wird mit der Variablen HISTSIZE eingestellt. Wächst die History darüber hinaus, verwirft die Bash die ältesten Zeilen. Mit dem Kommando history kann man die History auflisten und mit history -c löschen.

Wichtige interne Kommandos

Interne Kommandos sind direkt in die bash eingebaut. Es muss also kein externes Programm geladen und gestartet werden und so ist die Kommandoausführung schneller und speicherschonender.

Stringoperationen

Ausdruck Bedeutung
${#string} Länge des $string
${string:position} Extrahiert Teilstring aus $string ab $position
${string:position:length} Extrahiert einen Teilstring von $length Zeichen aus $string ab $position [erstes Zeichen hat Position 0]
${string#substring} Entferne kürzeste Übereinstimmung von $substring am Anfang von $string
${string##substring} Entferne längste Übereinstimmung von $substring am Anfang von $string
${string%substring} Entferne kürzeste Übereinstimmung von $substring am Ende von $string
${string%%substring} Entferne längste Übereinstimmung von $substring am Ende von $string
${string/substring/replacement} Ersetze erstes Auftreten $substring durch $replacement
${string//substring/replacement} Ersetze alle Auftreten von $substring durch $replacement
${string/#substring/replacement} Wenn $substring sich mit dem Anfang von $string deckt, ersetze $substring durch $replacement.
${string/%substring/replacement} Wenn $substring sich mit dem Ende von $string deckt, ersetze $substring durch $replacement.

Zeichenkettenbildung mit geschweiften Klammern

Die Bash setzt aus Zeichenketten, die in geschweiften Klammern angegeben werden, alle denkbaren Zeichenkettenkombinationen zusammen. Die offizielle Bezeichnung für diesen Substitutionsmechanismus lautet "Klammererweiterung" (brace expansion). Beispielsweise wird teil{1,2,3} zu teil1 teil2 teil3. Klammererweiterungen können den Tippaufwand beim Zugriff auf mehrere ähnliche Datei\-namen oder Verzeichnisse reduzieren. Gegenüber Jokerzeichen wie * und ? haben Sie den Vorteil, dass auch noch nicht existierende Dateinamen gebildet werden können (etwa für mkdir). Beispiel:
user$ echo {a,b}{1,2,3}
a1 a2 a3 b1 b2 b3

echo {a,b,c}{e,f,g}.{1,2,3}
ae.1 ae.2 ae.3 af.1 af.2 af.3 ag.1 ag.2 ag.3 be.1 be.2 be.3 
bf.1 bf.2 bf.3 bg.1 bg.2 bg.3 ce.1 ce.2 ce.3 cf.1 cf.2 cf.3 
cg.1 cg.2 cg.3

Diverses

Ausdruck Interpretation
result=$(COMMAND) Kommandosubstitution, neue Schreibweise (siehe oben "Backquotes")
>(COMMAND) Processsubstitution
<(COMMAND) Processsubstitution

Berechnung arithmetischer Ausdrücke in runden/eckigen Klammern

Die Bash ist normalerweise nicht in der Lage, Berechnungen auszuführen. Wenn Sie "2 + 3" eingeben, weiß die Shell nicht, was sie mit diesem Ausdruck anfangen soll. Wenn Sie innerhalb der Shell eine Berechnung ausführen möchten, müssen Sie den Ausdruck in doppelte runde oder eckige Klammern setzen und ein $-Zeichen voranstellen, z. B. $[ 2 + 3 ] oder $(( 56 - 32 )). Der Umfang der Rechenmöglichkeiten bei doppelten runden Klammenrn entspricht etwa jenem des Kommandos expr. AUßerdem gibt es noch ähnlich wie bei C einen bedingter Ausdruck: (( var0 = var1<98?9:21 ))

Innerhalb der eckigen Klammern sind die meisten aus der Programmiersprache C bekannten Operatoren erlaubt: + - * / für die vier Grundrechenarten, % für Modulo-Berechnungen, == != < <= > >= für Vergleiche, << und >> für Bitverschiebungen, && und || für logisches UND und ODER etc. Ach Inkrement und Dekrement der Form $var++ oder $var-- sind möglich. Alle Berechnungen werden für 32-Bit-Integerzahlen ausgeführt (Zahlenbereich zwischen -2147483648 und +2147483647).

sed (stream editor)

sed '5d' lösche Zeile 5
sed '/[Tt]est/d' löscht alle Zeilen, die Test oder test beinhalten
sed -n '20,25p' text gibt nur Zeile 20 bis 25 aus
sed '1,10s/unix/UNIX/g' intro macht aus unix UNIX, egal an welcher Stelle der ersten 10 Zeilen von intro es auftaucht
sed '/jan/s/-1/-5' wechselt das erste -1 in -5 in allen Zeilen, die jan beinhalten
sed 's/...//' data löscht die ersten drei Zeichen jeder Zeile von data
sed 's/...$//' data löscht die letzten drei Zeichen jeder Zeile von data
sed -n '1' text gibt alle Zeilen von text aus, wobei alle nicht druckbaren Zeichen als \nn (nn ist der oktale Wert des Zeichens) und alle Tabzeichen als > ausgegeben werden

tr

tr char1 char2 wird benutzt, um Zeichen char1 aus der Standardeingabe zu char2 übersetzen
tr : '\nnn' ersetzt den Doppelpunkt durch das Zeichen des entsprechenden oktalen Wertes nn
tr 'X' 'x' ersetze alle großen X durch kleine x
tr '()' '{}' ersetze alle runden Klammern auf durch geschweifte Klammern auf und alle runden Klammern zu durch geschweifte Klammern zu
tr '[a-z]' '[A-Z]' ersetze alle Kleinbuchstaben durch Großbuchstaben
tr '[A-Z]' '[N-Z]' '[A-M]' ersetze alle großen A-M durch N-Z und alle N-Z durch A-M
tr '\11' ' ' ersetze alle Tabzeichen durch ein Leerzeichen
tr -s ' ' ' ' ersetze mehrere aufeinanderfolgende Leerzeichen durch ein einzelnes Leerzeichen
tr -d '\14' lösche alle Seitenvorschubzeichen (oktal 14)
tr -d '[0-9]' löscht alle Ziffern

Zum Inhaltsverzeichnis Zum nächsten Abschnitt
Copyright © Hochschule München, FK 04, Prof. Jürgen Plate