Linux-Kompendium: Shellprogrammierung: Beispiele für Unix-Befehle
Aus Wikibooks
Zurück zu Shellprogrammierung
Inhaltsverzeichnis |
[Bearbeiten] Einfache Unix-Befehle
[Bearbeiten] ls
$ ls -l -d /tmp drwxrwxrwt 16 root wheel 1536 Dec 30 10:16 /tmp
Das ist ein einfacher Unix-Befehl (simple command). Die Shell ruft das Programm ls mit den Argumenten -l, -d und /tmp auf. Die Argumente, denen ein - vorangestellt ist, heißen im Unix-Jargon Optionen. /tmp ist keine Option. Das Programm ls ist so aufgebaut, dass
- die Reihenfolge, in der die Optionen angegeben werden, unerheblich ist
- mehrere Optionen zu einem Argument zusammengefasst werden können
- die Optionen aus nur einem Zeichen bestehen
- die Optionen vor anderen Argumenten stehen müssen
Die Kommandos
ls -l -d /tmpls -d -l /tmpls -ld /tmpls -dl /tmp
sind also völlig gleichwertig.
[Bearbeiten] echo
$ echo hello world hello world $ echo hello world hello world
Der echo-Befehl schreibt die nachfolgenden Zeichenketten aufs Terminal. Die Zeichenketten sind also die Argumente zum echo-Befehl. Jeweils zwei aufeinanderfolgende Argumente müssen durch mindestens ein Leerzeichen getrennt sein. Die Zeichenketten werden getrennt durch ein Leerzeichen ausgegeben.
[Bearbeiten] Variablen-Expansion
[Bearbeiten] Variablen belegen
Der Befehl
variable=zeichenkette
weist der Variablen variable den Wert zeichenkette zu. Eine Variable ist eine Zeichenkette, die mit einem Buchstaben oder Unterstrich (_) beginnt, auf den eine beliebig lange Folge von Buchstaben, Ziffern und Unterstrichen folgt.
$ H=hello
$ L=' '
$ W=world
$ echo $H$L$W
hello world
$ echo hello$L$W
hello world
$ echo $H$Lworld
hello world
$ echo $H${L}world
hello world
Hier werden den Variablen H, L und W Zeichenketten zugewiesen. Der Variablen L wird hier ein Leerzeichen zugeordnet. Die einfachen Hochkommas ist notwendig, der Variablen wird aber nur die Zeichenkette zwischen den beiden Hochkommas zugeordnet.
[Bearbeiten] Die PATH-Variable
Die $PATH-Variable enthält die Pfade, in denen bei der Eingabe eines Befehls gesucht werden soll.
$ echo $PATH /usr/local/bin:/usr/X11R6/bin:/usr/games:/usr/bin:/bin:/usr/sbin:/sbin
Gibt man also den Befehl meinprogramm ein, so wird an folgenden Stellen der Reihe nach geschaut, ob das Programm vorhanden ist:
- /usr/local/bin/meinprogramm
- /usr/X11R6/bin/meinprogramm
- /usr/games/meinprogramm
- /usr/bin/meinprogramm
- /bin/meinprogramm
- /usr/sbin/meinprogramm
- /sbin/meinprogramm
Sobald an einer dieser Stellen das Programm existiert, wird es ausgeführt.
[Bearbeiten] Leere Variablen
Das Ausgeben einer nicht gesetzten Variable führt nicht zu einem Fehler, sondern einfacher zu einer Leerzeile:
$ echo $UNSET_VARIABLE $
[Bearbeiten] Die HOME-Variable
In der Variable $HOME ist das Heimatverzeichnis des aktuellen Benutzers gespeichert:
$ echo $HOME /home/guenter
Ein Aufruf von cd (change directory) ohne Parameter führt zu einem Wechseln ins in $HOME angebene Verzeichnis:
$ cd $ pwd /home/guenter $ HOME=/tmp $ cd $ pwd /tmp
[Bearbeiten] Tilde-Expansion
Eine Zeichenkette der Form ~name wird zum Heimatverzeichnis des Benutzers "name" expandiert:
$ echo Das HOME-Verzeichnis von guenter ist ~guenter Das HOME-Verzeichnis von guenter ist /home/guenter
Sollte dieser Benutzer nicht existieren (wie im folgenden Beispiel), bleibt es bei der angegebenen Zeichenkette:
$ echo Das HOME-Verzeichnis von ~xyz654 ist ~xyz654 Das HOME-Verzeichnis von ~xyz654 ist ~xyz654
[Bearbeiten] Verkettung von Befehlen
Der echo-Befehl kann auch eine Zeichenkette mit der Ausgabe eines anderen Befehls verbinden. Dieser andere Befehl wird dann in Backticks (``) angegeben, wie hier der date-Befehl:
$ echo "Heute haben wir `date '+ %A, %Y-%m-%d %H:%M:%S'`" Heute haben wir Sunday, 2007-12-30 11:04:40
Die Ausgabe eines Befehls kann über eine sogeannte Pipe (|) als Eingabe an einen anderen Befehl weitergereicht werden:
$ cut -d: -f 7 /etc/passwd | grep '^/bin/' | sort | uniq -c 1135 /bin/bash 1965 /bin/csh 5 /bin/false 198 /bin/ksh 442 /bin/sh 333 /bin/tcsh 1 /bin/true 21 /bin/zsh
Der time-Befehl misst die Zeit, die ein ander Befehl für die Ausführung benötigt:
time (let I=1000; while ((I>0)); do ((I-=1)); echo $I>/dev/null; done;); \
> time (let I=1000; while ((I>0)); do ((I-=1)); /bin/echo $I>/dev/null; done;)
0m0.02s real 0m0.03s user 0m0.00s system
0m8.07s real 0m0.09s user 0m1.03s system

