Linux-Praxisbuch/ Shellprogrammierung/ Beispiele für Unix-Befehle
Einfache Unix-Befehle
[Bearbeiten]ls
[Bearbeiten]$ 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 /tmp
ls -d -l /tmp
ls -ld /tmp
ls -dl /tmp
sind also völlig gleichwertig.
echo
[Bearbeiten]$ 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.
Variablen-Expansion
[Bearbeiten]Variablen belegen
[Bearbeiten]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 $ 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 sind notwendig, der Variablen wird aber nur die Zeichenkette zwischen den beiden Hochkommas zugeordnet.
Beachten Sie echo $H$Lworld. Hier wird versucht auf die Variable Lworld zuzugreifen. Diese Variable gibt es nicht. Wenn man auf eine Variable zugreift, die es nicht gibt, wird eine leere Zeichenkette ausgegeben (also gar nichts). In diesem Fall erscheint also nur das Wort hello.
Wenn also eine Variable direkt von Text gefolgt wird, und somit nicht das Ende der Variablen erkennbar ist, kann sie, wie im letzten Beispiel in geschweifte Klammern gesetzt werden. Jetzt ist es wieder eindeutig: Variable H (hello), L (ein Leerzeichen) und das direkte Wort (world).
Die PATH-Variable
[Bearbeiten]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.
Leere Variablen
[Bearbeiten]Das Ausgeben einer nicht gesetzten Variablen führt nicht zu einem Fehler, sondern einfach zu einem Leerstring, in anderen Worten; es wird kein Zeichen ausgegeben, wenn die Variable nicht bekannt ist. "echo" ohne einen Text erzeugt eine Leerzeile.
$ a="Staub" $ b="sauger" $ echo $a$IRGENDEINE_UNBEKANNTE_VARIABLE$b Staubsauger $ echo $ echo $IRGENDEINE_UNBEKANNTE_VARIABLE $
Die HOME-Variable
[Bearbeiten]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
Tilde-Expansion
[Bearbeiten]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
Verkettung von Befehlen
[Bearbeiten]Der echo-Befehl kann auch eine Zeichenkette mit der Ausgabe eines anderen Befehls verbinden. Dieser andere Befehl wird dann in runden Klammern mit vorangestelltem Dollarzeichen $()
oder 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
oder
$ 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 sogenannte 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 anderer 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