Linux-Praxisbuch/ Shellprogrammierung/ Beispiele für Unix-Befehle

Einfache Unix-Befehle

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 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