Yet Another Linux Tutorial

Die Shell Dateien Editoren Backups Archive Laufwerke Prozesse
Administration Netzwerk Userverwaltung Rechte Links Suchen

Die Shell


Der Prompt
Der grundlegende Aufbau eines Kommandos
Listen & Gruppen
Der Kommandozeileneditor
sinnvolle Tastenkommandos
Kommandozeilenspeicher
Sonder- & Metazeichen
Status, Rückgabewert
Reservierte Wörter
Variablen und Environment
Ein/Ausgabeumleitung
Kontrollstrukturen
virtuelle Konsolen und Terminals
Und nun ...


[top] Die Shell


Eine große Vielseitigkeit der Shell ist das man jedes Kommando mit allen Optionen aufrufen kann während man in einem z.B. grafischen oder menügesteuertem System nur die Aktionen wählen kann die einem angezeigt werden.


Die Arbeit mit einer Shell geschieht interaktiv. Die Shell liefert ein Prompt (Eingabeaufforderung), und ein User kann es mit Kommandos füllen. Wird eine solche Kommandozeile mit ENTER bestätigt, interpretiert die Shell die Zeile und führt die Kommandos aus. Da manche Kommandos recht lange sind oder häufig gebraucht werden kann man diese auch in Scriptdateien schreiben.


Es gibt viele Shells wie z.B. die tcsh, csh, sh, ksh oder wie sie alle heißen mögen. Ich beziehe mich im folgendem auf die bash auch bourne again shell genannt, welche in den meisten Distributionen die Standardshell ist. Sie ist eine Erweiterung der bourne shell (sh) mit nützlichen Features anderer Shells.


[top] Der Prompt


Am Anfang sieht man eine Zeile die in etwa so aussieht:


woody@camel:~$


Wenn so etwas sieht wartet die Shell sozusagen auf ein Kommando. Da steht am Anfang der Username, durch ein @ getrennt vom Hostnamen des Rechners. Nach dem : steht das aktuelle Verzeichnis und bei einem User am Ende ein $, bei root steht am Ende ein #. Natürlich kann man das, wie alles andere auch, an seine Bedürfnisse anpassen. Dazu muss man nur die Environment Variable PS1 entsprechend setzen mit export. Mögliche Werte sind z.B.:

\t die aktuelle Zeit in hh:mm:ss (19:14:23)
\d das Datum mit W.-Tag Monat M.-Tag (Tue Jun 02)
\w das aktuelle Verzeichnis (/home/camel)
\u den Usernamen (camel)
\h den Rechnernamen (woody)
\# die Kommandonummer, beginnt bei jedem login bei 0 und steigt mit jedem Kommando um eins
\$ ein einfaches $ wenn es sich um einen User handelt, bei root steht ein #
\\ ein einfacher Backslash \
Beispiele
export PS1="\u@\h:\w\$ " das ist oft der Standard camel@woody:~$
export PS1="Es ist \t, Befehl-Nr. \#: " man kann es auch mit Text mischen Es ist 15:29:12, Befehl-Nr. 12:
export PS1="\d \t \w\$ " wer sich nicht das Datum merken kann Mon May 31 15:28:27 ~$

[top] Der grundlegende Aufbau eines Kommandos


Ein Kommando besteht üblicherweise aus 3 Teilen und sieht so aus:


Befehl Optionen Argumente


Der Befehl ist das zu startende Programm (Script). Die Optionen können Anweisungen für das Programm sein und werden üblicherweise mit einem - eingeleitet, z.B. was es machen soll oder wie. Als Argument wird oft übergeben mit was sich der Befehl beschäftigen soll. Das sind oft Dateien oder Geräte kann aber auch irgendwas anderes sein. Bei vielen Kommandos sind die Optionen und Argumente optional und können auch weggelassen werden.


Eine Option die fast jedes Programm hat ist --help dabei wird eine kurze Übersicht der verfügbaren Optionen gezeigt und sollte das nicht reichen kann man mit man Befehl die man-page zu dem Befehl durchstöbern (q zum beenden ;o)).


Wird ein Kommando mit ENTER bestätigt, interpretiert die Shell dieses. Dabei werden z.B. Klammern ausgewertet und Variablen ersetzt. Anschließend wird ein Unterprozess gestartet der das Kommando ausführt und nach Beendigung liefert die Shell wieder einen Prompt.


Man kann Programme auch im Hintergrund starten mit &, dabei wird gleich wieder ein Prompt angezeigt ob das Kommando abgearbeitet ist oder nicht. Wenn Ein Programm gestartet ist kann man es mit STRG+Z in den Hintergrund schicken, dann sieht man die Nummer des Hintergrundprozesses. Dabei wird es aber auch gestoppt, damit es weiter läuft muss man noch bg Nummer eintippen. Und mit fg Nummer holt man sich den Prozess wieder in den Vordergrund.


Soll ein Kommando der Übersicht halber über mehrere Zeilen gehen kann man mit \ ENTER in der nächsten Zeile weiter schreiben ohne das das Kommando schon ausgeführt wird.


STDIN STDOUT & STDERR


Kommandos kommunizieren standardmäßig über 3 Ebenen, Standardeingabe (STDIN, oder 0), Standardausgabe (STDOUT, oder 1) und Standardfehlerausgabe (STDERR, oder 2). Eingaben werden über STDIN angenommen und ein Output an STDOUT geschickt, wobei Fehlermeldungen auf STDERR erscheinen.


Kommandosubstitution


Das sind Kommandos innerhalb anderer Kommandos, um z.B. als Argumente zu dienen. Sie werden zwischen verkehrten Anführungsstriche geschrieben `Kommando`. Man kann damit auch den Output eines Kommandos einer Variablen zuweisen.


Beispiel für eine Kommandosubstitution
Diskinfo=`fdisk -l | grep -i disk`
echo $Diskinfo
Disk /dev/hda: 30.6 GB, 30606151680 bytes
speichert die Platteninfo, die wir aus dem Kommando mit fdisk und grep bekommen, in die Variable $Diskinfo. Der Inhalt von $Diskinfo wird anschließend mit echo ausgegeben

[top] Listen & Gruppen


Listen


Eine Folge von Kommandos kann zu einer Liste zusammengefügt werden. Die Kommandos werden dabei mit den Zeichen &&, ||, & und ; zu einer Liste zusammengefasst. Sie muss weiters mit einem &, ; oder Zeilenende abgeschlossen werden.


Listen mit ; und &


; Trennt 2 Kommandos voneinander. Diese werden nacheinander ausgeführt. Ein Prompt erscheint erst wieder wenn alle Kommandos durchgeführt sind
& Trennt 2 Kommandos voneinander oder führt eines im Hintergrund aus. Diese werden gleichzeitig ausgeführt. Es erscheint sofort wieder ein Prompt
Bei beiden ist der Rückgabewert der des letzten Kommandos


Listen mit && und || (Bedingte Ausführung)


&& führt das rechte Kommando nur aus wenn das linke erfolgreich war
beide Kommandos müssen erfolgreich sein damit die Bedingung wahr (Rückgabewert von 0) ist
|| führt das rechte Kommando nur aus wenn das linke nicht erfolgreich war
nur ein Kommando muss erfolgreich sein damit die Bedingung wahr ist


Gruppen


Kommandos können weiter zu Gruppen zusammengefasst werden um z.B. komplexere Listen zu erstellen


{ } einfache Gruppe


( ) Gruppe in einer eigenen Shell. Dadurch kann man in einem Kommando einen Teil von einer Subshell ausführen lassen. Dabei sind Veränderungen am Environment nur für diesen Teil wirksam und nicht für das restliche Kommando.


[top] Der Kommandozeileneditor


Einige Kommandos werden mit einem bestimmten Symbol eingeleitet oder müssen damit aufhören, wie z.B. eine for-Schleife die mit for beginnt und done endet, ein Text in "Anführungsstrichen" oder ein Kommando in (Klammern). Wird nun eine Zeile eingegeben in der so ein Schluss-Symbol fehlt bemerkt das die Shell und gibt in einer neuen Zeile ein sekundäres Prompt aus in der man das Kommando weiter tippen kann.


Wie gesagt können manche Kommandos sehr umfangreich sein und darum gibt es den Kommandozeileneditor. Er bietet neben den einfachen Funktionen wie Zeichen vor, zurück, oder löschen, noch eine Menge Funktionen wie ausschneiden, einfügen, in der Zeile springen usw. Die Funktionen sind denen von vi und emacs nachempfunden wobei man normalerweise im emacs-Modus arbeitet. Mit set emacs und set vi kann man zwischen den Modi wechseln. Natürlich kann man sich das Verhalten auch an seine Bedürfnisse anpassen z.B. mit bind. Um die Belegung dauerhaft zu speichern muss man das noch in der Datei ~/.inputrc eintragen. Will man die Belegung für alle User speichern so muss die Datei /etc/inputrc editiert werden (bzw. die Datei die in der Shell variablen INPUTRC steht). Der Aufbau von inputrc und dem bind Kommando ist gleich:


Taten:Funktion


Jetzt kommen erst mal ein paar nützliche bind Optionen dann die Zeichen für spezielle Tasten und ein paar Beispiele.

Optionen
-f Datei liest die Bindungen aus der angegebenen Datei
-l zeigt die verfügbaren Funktionen an, die belegt werden können
-m gibt die keymap an, in der die Bindung verwendet werden soll. Mögliche keymaps sind:
emacs, emacs-standard, emacs-meta, emacs-ctlx, vi, vi-move, vi-command und vi-insert
-r Taste entfernt die Bindung von einer Taste
-P zeigt alle Funktionen und ob bzw. wo sie belegt sind
Besondere Tasten
\C- CTRL (STRG)
\e- Meta/ESC
\M- Meta/ALT
RUBOUT Backspace
DEL Delete, Entfernen
ESC Escape
SPACE, SPC Leerzeichen
RETURN, RET, NEWLINE, LFD Zeilenende
TAB Tabulator
Beispiele
bind -m emacs '"\C-xv":vi-editing-mode' Belegt die Tastenkombination CTRL+x+v zum wechseln in den vi-modus
bind -m vi '"\C-xe":emacs-editing-mode' Belegt die Tastenkombination CTRL+x+e zum wechseln in den emacs-modus

[top] sinnvolle Tastenkommandos


Da man oft recht lange Befehle eintippt ist es mühsam mit Pfeil links/rechts zu navigieren oder Zeichen einzeln zu löschen. Damit das etwas flotter geht hier mal ein paar Tastatur befehle:

Tabulator vervollständigt einen Befehl oder ein(e) Verzeichnis/Datei, drückt man die Taste 2x so sieht man alle Möglichkeiten
CTRL+a springt an den Anfang der Zeile
CTRL+e springt an das Ende der Zeile
ALT+f springt zum nächsten Wortende (forward)
ALT+b springt zum nächsten Wortanfang (back)
CTRL+l löscht den Bildschirm, bis auf die Kommandozeile
CTRL+k vom Cursor bis zum Zeilenende Ausschneiden (löschen)
CTRL+u vom Cursor bis zum Zeilenanfang ausschneiden (löschen)
CTRL+y einfügen

[top] Kommandozeilenspeicher


Ein sehr nützliches Feature der Shell ist der Kommandozeilenspeicher die so genannte history. In Ihr sind die letzten Befehle gespeichert. Das erspart einem sehr viel Tipparbeit wenn man Kommandos immer wieder in gleicher oder ähnlicher Form braucht. In diesem Fall navigiert man zum entsprechendem Kommando und wiederholt es.

Pfeil rauf in der History um ein Kommando zurück
Pfeil runter in der History um ein Kommando vor, das Unterste ist das soeben eingegebene
CTRL+R öffnet den suchen Dialog. Gibt man einen Suchbegriff ein springt er autom. zur nächsten Übereinstimmung, mit einem weiteren CTRL+R springt er zur nächsten Übereinstimmung.

[top] Sonder- & Metazeichen


So wie überall gibt es auch hier eine Reihe von Zeichen die besonderes bewirken. Da gibt es einige um Kommandos zu verbinden oder zu trennen, welche um Teile eines Kommandos gesondert auszuführen, oder Ein/Ausgaben umzuleiten. Hier mal die wichtigsten:

; Kommandoliste, Trennt 2 Kommandos voneinander.
& Kommandoliste, Trennt 2 Kommandos voneinander oder führt eines im Hintergrund aus.
&& bedingte UND Ausführung
|| bedingte ODER Ausführung
() Kommandogruppe
# Alles was nach diesem Zeichen steht sind Kommentare die von der Shell ignoriert werden
` Kommandosubstitution
| Pipeline
< Eingabeumleitung
> Ausgabeumleitung
$ Leitet eine Variable Ein
" umschließt einen String
' umschließt auch einen String

Wenn man ein Metazeichen als normales Zeichen behandeln will so muss man es entwerten. Dazu gibt es folgende 3 Möglichkeiten.

\ Backslash oder Fluchtsymbol, entwertet ein einzelnes Metazeichen oder leitet ein Sonderzeichen ein
' Hochkomma, innerhalb dieser werden alle Metazeichen bis auf ' entwertet
" Anführungszeichen, innerhalb dieser werden alle Metazeichen bis auf $ \ " und ' entwertet
Beispiele
echo $HOME
/home/camel
echo zeigt den Inhalt der Variablen $HOME
echo "$HOME"
/home/camel
trotz der Anführungsstriche wird das $ nicht ausgegeben sondern als Variable interpretiert
echo "\$HOME"
$HOME
mit dem Fluchtsymbol \ davor kann man es für die Ausgabe entwerten und man sieht nun $HOME statt den Inhalt der Variablen
echo '$HOME'
$HOME
im Gegensatz zum Anführungsstrich entwertet das Hochkomma gleich das $
echo '\$HOME'
\$HOME
und auch das Fluchtsymbol wird wie ein normales Zeichen ausgegeben

[top] Status


Jedes Kommando kann einen Status zurückgeben der Aufschluss darüber gibt wie das Programm beendet wurde. Anders als bei anderen Programmiersprachen ist der Rückgabewert eines erfolgreichen Kommandos 0. Den Status des zuletzt ausgeführten Kommandos kann man in der Variablen $? nachsehen

0 wahr - Programm wurde ohne Fehler ausgeführt
alles andere nicht wahr - ob es sich allerdings tatsächlich um einen Fehler handelt hängt vom Kommando ab

[top] Reservierte Wörter


Wie in jeder Programmiersprache gibt es in der Shell auch reservierte Wörter die man nicht für Variablen oder Funktionen benutzen darf.


! case do done elif else esac fi for function if in select then time until while {}


[top] Variablen und Environment


Variablen


Variablen sind dazu da um Daten unter einem leichter zu merkenden Namen abzuspeichern. Variablennamen müssen mit einem Buchstaben oder _ beginnen und dürfen weiters nur Buchstaben, Ziffern und _ enthalten.


Wertzuweisung


variable=wert


Die Wertzuweisung Erfolg mit einem einfachen = Es darf kein Leerzeichen vor und nach dem = sein.


Variablen Löschen


Variablen werden mit dem Befehl unset gelöscht. Dazu gibt man einfach unset Variable ein.


Variablenzugriff


Wie man in den Beispielen schon sieht, werden anders als beim Wert zuweisen, die Variable mit einem $ vor dem Variablennamen angesprochen. Um den Inhalt einer Variablen anzusehen gibt man einfach echo $Variable ein.


Erweiterte Wertzuweisung


Manchmal ist es sinnvoll eine Variable abhängig von einer anderen zu setzten. Mit der erweiterten Wertzuweisung wird eine Variable auf vorhanden sein geprüft. Wenn sie vorhanden und nicht leer ist wird sie eingesetzt ansonsten der Angegebene Wert.
Folgendes ist vielleicht erst nach ein paar mal lesen verständlich:

${Variable:-Wert} Wenn die Variable existiert und nicht nur aus einem Leerzeichen besteht wird sie eingesetzt andernfalls der Wert
${Variable:=Wert} Wenn die Variable existiert und nicht nur aus einem Leerzeichen besteht wird sie eingesetzt andernfalls der Wert. Anders als oben ist das hier auch der Variablen selbst der Wert zugewiesen wird
${Variable:?Wert} Wenn die Variable existiert und nicht nur aus einem Leerzeichen besteht wird sie eingesetzt andernfalls wird die Verarbeitung abgebrochen
${Variable:+Wert} Wenn die Variable existiert und nicht nur aus einem Leerzeichen besteht wird der Wert eingesetzt, ansonsten gar nichts
Test=${Variable:-Wert} Test ist 'Wert' und Variable ist ''
Test=${Variable:=Wert} Test ist 'Wert' und Variable ist 'Wert'
Test=${Variable:?Wert}
-bash: Variable: Wert
man sieht wie das Kommando mit einer Meldung abbricht
Test=${Variable:+Wert} Test ist '' und Variable ist ''
und nun mit Variable=hallo
Test=${Variable:-Wert} Test ist 'hallo' und Variable ist 'hallo'>
Test=${Variable:=Wert} Test ist 'hallo' und Variable ist 'hallo'>
Test=${Variable:?Wert} Test ist 'hallo' und Variable ist 'hallo'>
Test=${Variable:+Wert} Test ist 'Wert' Variable ist 'hallo'
Environment


Das Environment, auch Umgebungsvariablen genannt, ist eine Sammlung von Variablen auf die ein Programm zugreift. Um sich das Environment anzusehen gibt man export ein. Hier nun ein Auszug aus den Environment-Variablen:

HOME enthält den Pfad zum Homeverzeichnis
PATH da sind die Pfade enthalten in denen nach Programmen gesucht werden soll
PWD enthält den Pfad zum aktuellen Verzeichnis
OLDPWD enthält den Pfad zum vorherigen Verzeichnis
SHELL in dieser Variablen steht die verwendete Shell
PS1 enthält das Aussehen des Prompt
USER hier steht der Username drinnen
TERM und hier noch das verwendete Terminal

Vererbung


Wird ein Prozess gestartet legt die Shell für jeden Wert im Environment eine Variable an, und übergibt diese dem Prozess. Verändert ein Prozess eine Variable hat das nur Auswirkungen aus das vererbte Environment, nicht auf das der anderen Programme. Wäre ja schlimm wenn sich die Programme untereinander die Variablen überschreiben :o)


export


Mit dem Kommando export kann man eine Variable aus einem vererbten Environment ins Environment exportieren (setzen). Führt man das Kommando ohne Argumente aus sieht man die Werte des aktuellen Environment


set


set zeigt alle Variablen mit deren Werten an.

Besondere Variablen

$- Diese Variable enthält die Optionen, die beim Aufruf der Shell angegeben wurden.
$! Hier findet man die PID des zuletzt im Hintergrund gestarteten Prozesses.
$$ Enthält die PID der Shell selbst. Praktisch für Selbstmord (kill -9 $$)
$? Enthält den Rückgabewert des letzten Kommandos

Argument-Variablen innerhalb von Kommandos und Scripten

$0 diese Variable enthält den Kommando- bzw. Scriptnamen
$1-9 in diesen Variablen stehen die mitgegebenen Argumente
$* und hier stehen alle Argumente auf einmal
$# und in dieser noch die Anzahl der Argumente

Platzhalter oder auch Wildcard genannt

? steht für genau ein beliebiges Zeichen
* steht für beliebig viele Zeichen

[top] Ein/Ausgabeumleitung


Wenn man z.B. den Output eines Programms speichern will zwecks späterer Weiterverarbeitung, oder weil man einem Fehler sucht und so das Output an jemanden schicken kann der einem dann weiterhilft, kann man das mit einer Ausgabeumleitung machen. Man kann auch den Output eines Kommandos als Input für ein anderes benutzen.

< File Das File wird als Standardeingabe verwendet gleich wie 0<File
> File Das File wird als Standardausgabe verwendet gleich wie 1>File, um eben ein Output in ein File zu schreiben. Der Inhalt wird dabei gelöscht bzw. wird es neu angelegt wenn es nicht existiert
2>>File Das File wird als Standardfehlerausgabe verwendet, wobei die Ausgabe angehängt wird

Mit einem & lassen sich auch noch STDIN, STDOUT und STDERR untereinander vertauschen. Da gibt es eine Menge Kombinationen, ich will mal ein paar einfache veranschaulichen:

<&1 Leitet STDIN auf STDOUT um
<&2 Leitet STDIN auf STDERR um
>&2 Leitet STDOUT auf STDERR um
Beispiele
ls /nicht/vorhanden > test 2>&1
cat test
ls: /nicht/gefunden: No such file or directory
Hier wird zuerst STDOUT in die Datei umgelenkt, danach verdoppelt und statt STDERR gesetzt. Daher sehen wir die Fehlermeldung in der Datei test.
ls /nicht/vorhanden 2>&1 > test
ls: /nicht/gefunden: No such file or directory
cat test
Hier wiederum wird zuerst STDERR durch STDOUT ersetzt und dann die Datei umgeleitet. Da wir aber nur eine Fehlermeldung haben ist die Datei test leer.

Um den Output eines Kommandos als Input für ein anderes zu benutzen, kann man eine Pipeline benutzen

Kommando1 | Kommando2 Dabei werden beide Kommandos gleichzeitig gestartet und der Output des linken wird über die Pipe (|) zum Input des rechten Kommandos
Beispiel
cat Datei | grep Begriff ein sehr häufiges Kommando ist dieses. cat listet uns eine Datei auf und grep pickt uns über die Pipe nur die Zeilen raus die den Begriff enthalten. Es geht auch einfacher ohne dem cat, einfach nur grep Begriff Datei

[top] Kontrollstrukturen


Wie aus anderen Programmiersprachen bekannt gibt es in der bash auch gewisse Kontrollstrukturen wie for-Schleifen, while-, if- Bedingungen, case Verknüpfungen und select Abfragen. Wie diese funktionieren will ich mal versuchen zu verdeutlichen.


Die for Schleife


for Name [in Liste]
do
Kommando
done


for Name [in Liste]; do Kommando; done



Die for Schleife wird so oft durchlaufen wie es Argumente in der Liste gibt. Bei jedem Durchlauf nimmt die Variable Name den nächsten Wert in der Liste an, und die Kommandos zwischen do und done werden ausgeführt. Vor do und done muss eine neue Zeile beginnen oder mit einem ; ein Kommandoende stattgefunden haben. Als Liste kann auch der Inhalt des aktuellen Verzeichnisses dienen mit z.B.:


for Textdatei in *.txt
do
echo $Textdatei
done



Führt für jede gefundene .txt Datei im Verzeichnis ein echo aus


Die if Bedingung


if Kommando
then
Kommando


elif Kommando
then
Kommando


else
Kommando


fi


if Kommando; then Kommando; elif Kommando; then Kommando; else Kommando; fi



Mit if kann man das ausführen von Kommandos von Bedingungen abhängig machen. Das Kommando direkt nach if ist die Bedingung. Wenn sie einen Rückgabewert von 0 hat wird der then Teil ausgeführt. Wenn jedoch ein anderer Rückgabewert als 0 herauskommt, wird die nächste elif Bedingung geprüft und wenn wahr die Kommandos nach dessen then ausgeführt. Ist keine elif Anweisung vorhanden oder alle Bedingungen falsch, wird wenn vorhanden der else Teil ausgeführt. Vor then, elif, else und fi muss eine neue Zeile beginnen oder mit einem ; ein Kommandoende stattgefunden haben. Eine if Anweisung endet immer mit einem fi. Der elif und else Teil sind optional also kann eine Einfache if Anweisung schon so aussehen:


if test -d $dir
then
echo "$dir ist ein Verzeichnis"
fi



Damit wird, wenn es sich bei der Variablen $dir um ein Verzeichnis handelt, dies mit einem kurzen Text bestätigt.


Fallunterscheidung mit case


case Variable in
Wert1) Kommando
;;
Wert2) Kommando
;;
esac


case Variable in Wert1) Kommando; ;; Wert2) Kommando; ;; esac



Mit der case Anweisung kann ein Kommandoteil angesprungen werden. case überprüft die Variable auf Übereinstimmung bei den Werten die mit einem ) am Ende markiert sind. Bei einem Treffer werden die Kommandos dahinter bis zum nächsten ;; ausgeführt. Ein verständliches Beispiel ist folgendes welches eine Ja/Nein Abfrage behandeln soll:


case $variable in
ja|yes|j|y) echo "Auswahl bestätigt"
;;
nein|no|n) echo "Programm abgebrochen"
;;
esac



Um sich noch gegen User zu schützen die Prinzipiell nichts oder das falsche eintippen kann man eine erweiterte Wertzuweisung verwenden bzw. mit * eine Anweisung für alle anderen Eingaben erzeugen.


case ${Name:=nichts} in
ja|yes|j|y) echo "Auswahl bestätigt"
;;
nein|no|n) echo "Programm abgebrochen"
;;
nichts) echo "keine Eingabe"
;;
*) echo "falsche Eingabe"
;;
esac



Die while Schleife


while Kommando
do
Kommando
done


while Kommando; do Kommando; done



ähnlich wie die if Anweisung prüft while eine Bedingung auf wahr, und führt den Kommandoteil zwischen do und done aus. Der Unterschied ist jedoch das der Teil zw. do und done so oft wiederholt wird bis die Bedingung falsch ist. Auch hier muss vor do und done eine neue Zeile beginnen oder mit einem ; ein Kommandoende stattgefunden haben.


while read dir; test -d $dir
do
echo "$dir ist ein Verzeichnis"
done



Hier wird geprüft ob die Eingabe einem Verzeichnis entspricht, read fordert uns zu einer Eingabe auf die dann unter der Variablen dir gespeichert wird. Die Schleife geht so lange bis man ein ungültiges Verzeichnis eingibt.


Abfragen mit select


select Name in Wert1 Wert2 Wert3
do
echo "Die Auswahl war: $Name"
break
done


select Name in Wert1 Wert2 Wert3; do echo "Die Auswahl war: $Name"; break; done



Mit select lassen sich einfache Menüabfragen erstellen. Die möglichen Werte stehen nach dem in und werden bei einer Auswahl in die Variable, hier Name, gespeichert. Wird keine getroffen erscheint das Menü von neuem. Ansonsten wird der do Teil ausgeführt und auf eine weitere Eingabe gewartet. Daher sollte man eine select Anweisung mit einem break beenden.


[top] virtuelle Konsolen und Terminals


Ein Terminal ist die Kombination aus Tastatur, Maus und Monitor und dient als Standardein- und Ausgabe. Da in einem Multiuser/Multitasking System mehrere User/Programme gleichzeitig arbeiten können benutzt Linux virtuelle Terminals um die Ein- Ausgabekanäle zu steuern. Dadurch kann es bestimmen welchem virtuellen Terminal die reale Tastatureingabe bzw. der echte Bildschirm zugewiesen wird.


Der Bildschirm auf dem die Bootmeldungen zu sehen sind entspricht der Konsole. Sobald das System gestartet ist wird diese mit 7 oder mehr virtuellen Konsolen überlagert. Zwischen Ihnen kann man mit ALT+F1 - F7 wechseln. Auf ALT+F7 befindet sich normalerweise das X System mit der grafischen Oberfläche.


[top] Und nun ...


So jetzt kennen wir den Aufbau von Kommandos und können auch schon kleine Shellscripte erstellen. Nur fehlen noch die Befehle die man benutzen kann. Nachstehend will ich ein paar wichtige Befehle und deren Optionen nach Aufgabengebiete beschreiben. Zusätzlich sollen auch überall ein paar einfache Beispiele sein. Wenn man mal mehr Infos als die hier angegebenen braucht sollte man nie auf man und --help vergessen.

Hilfen auf die man nie vergessen sollte ;o)
Kommando --help (-h) zeigt eine Liste der verfügbaren Kommandos, meist mit kurzer Beschreibung
man Kommando öffnet die man-page zu einem Befehl in dem dieser beschrieben wird