Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

 << zurück
Shell-Programmierung von Jürgen Wolf
Einführung, Praxis, Referenz
Buch: Shell-Programmierung

Shell-Programmierung
782 S., mit CD, 44,90 Euro
Rheinwerk Computing
ISBN 3-89842-683-1
gp Kapitel 3 Parameter und Argumente
  gp 3.1 Einführung
  gp 3.2 Kommandozeilenparameter $1 bis $9
  gp 3.3 Besondere Parameter
    gp 3.3.1 Die Variable $*
    gp 3.3.2 Die Variable $@
    gp 3.3.3 Die Variable $#
  gp 3.4 Der Befehl shift
  gp 3.5 Argumente und Leerzeichen
  gp 3.6 Argumente jenseits von $9
    gp 3.6.1 Beliebig viele Argumente (Bash und Korn-Shell only)
  gp 3.7 Argumente setzen mit set und Kommando-Substitution
  gp 3.8 getopts – Kommandozeilenoptionen auswerten
  gp 3.9 Vorgabewerte für Variablen


Rheinwerk Computing

3.7 Argumente setzen mit set und Kommando-Substitutiotoptop

Es ist neben dem Kommandoaufruf auch noch ein anderer Weg möglich, die Positionsparameter $1 bis $n mit Werten zu belegen. Dies lässt sich mit dem Kommando set realisieren. Vorwiegend wird diese Technik dazu benutzt, Zeichenketten in einzelne Worte zu zerlegen. Ein Aufruf von set überträgt die Argumente seines Aufrufs nacheinander an die Positionsparameter $1 bis $n. Dies nehmen selbstverständlich auch die Variablen $#, $* und $@ zur Kenntnis (siehe Abbildung 3.3).


Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 3.3   Positionsparameter setzen mit set


Zur Demonstration folgender Vorgang in einer Shell:

you@host > set test1 test2 test3 test4
you@host > echo $1
test1
you@host > echo $2
test2
you@host > echo $3
test3
you@host > echo $4
test4
you@host > echo $#
4
you@host > echo $*
test1 test2 test3 test4

Hier werden die einzelnen Argumente durch den Befehl set an die Positionsparameter $1 bis $4 übergeben. Als Trenner zwischen den einzelnen Argumenten muss hier mindestens ein Leerzeichen (siehe Variable IFS) verwendet werden.

Nun aber noch zu folgendem Problem:

you@host > set -a -b -c
bash: set: -c: invalid option
set: usage: set [--abefhkmnptuvxBCHP] [-o option] [arg ...]

Hier hätte ich gern die Optionen –a, –b und –c an $1, $2 und $3 übergeben. Aber die Shell verwendet hier das Minuszeichen für »echte« Optionen, also Optionen, mit denen Sie das Kommando set beeinflussen können. Wollen Sie dem entgegnen, müssen Sie vor den neuen Positionsparametern zwei Minuszeichen (––) angeben.

you@host > set -- -a -b -c
you@host > echo $1 $2 $3
-a -b -c

Hinweis   Bitte beachten Sie, dass Sie mit set -- ohne weitere Angaben von Argumenten alle Positionsparameter löschen. Dies gilt allerdings nur für die Bash und die Korn-Shell. In der Bourne-Shell können Sie hierfür einen leeren String (set "") angeben.


Wie bereits erwähnt wurde, erfolgt der Einsatz von set eher nicht bei der Übergabe von Parametern, sondern der Zerlegung von Zeichenketten, insbesondere der Zeichenketten, die von Kommandos zurückgegeben werden. Ein einfaches Beispiel einer solchen Anwendung (natürlich wird hierzu die Kommando-Substitution herangezogen):

# Positionsparameter mit set und Kommando-Substitution
# auserinfo
set `who | grep $1`
echo "User        : $1"
echo "Bildschirm  : $2"
echo "Login um    : $5"

Das Script bei der Ausführung:

you@host > ./auserinfo you
User        : you
Bildschirm  : tty03
Login um    : 23:05
you@host > ./auserinfo tot
User        : tot
Bildschirm  : :0
Login um    : 21:05

Um zu wissen, wie die einzelnen Positionsparameter zu Stande kommen, muss man selbstverständlich mit dem entsprechenden Kommando vertraut sein. Hier wurde who verwendet. Mit einer Pipe wurde die Standardausgabe auf die Standardeingabe von grep weitergeleitet und filtert hierbei nur noch den entsprechenden String aus, den Sie als erstes Argument beim Aufruf mitgeben. Um zu sehen, welche Parameter set übergeben werden, können Sie einfach mal den Befehl who | grep you eingeben (für »you« geben Sie einen auf Ihrem Rechner vorhandenen Benutzernamen ein). Zwar wurde hierbei der Benutzername verwendet, aber es hindert Sie keiner daran, Folgendes vorzunehmen:

you@host > ./auserinfo 23:*
User        : you
Bildschirm  : tty03
Login um    : 23:05

Damit wird nach einem User gesucht, der sich ab 23 Uhr eingeloggt hat. Zurück zu den Positionsparametern; ein Aufruf von who verschafft Klarheit:

you@host > who
tot      :0             Feb 16 21:05 (console)
you      tty03          Feb 16 23:05

Daraus ergeben sich folgende Positionsparameter (siehe Abbildung 3.4):


Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 3.4   Positionsparameter nach einer Kommando-Substitution


Durch den Aufruf von

set `who | grep $1`

werden jetzt die einzelnen Positionsparameter den Variablen $1 bis $5 zugewiesen (optional könnten Sie hier mit »(console)« auch den sechsten Parameter mit einbeziehen), die Sie anschließend in Ihrem Script verarbeiten können – im Beispiel wurde eine einfache Ausgabe mittels echo verwendet. Dass dies derart funktioniert, ist immer der Shell-Variablen IFS zu verdanken, die das Trennzeichen für solche Aktionen beinhaltet. Sollten bei einem Kommando keine Leerzeichen als Trenner zurückgegeben werden, so müssen Sie die Variable IFS mit einem neuen Wert versehen.

Ein weiteres simples und häufig zitiertes Beispiel mit date:

you@host > date
Do Feb 17 01:05:15 CET 2005
you@host > set `date`
you@host > echo "$3.$2.$6 um $4"
17.Feb.2005 um 01:05:22


Ihre Meinung

Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.

 << zurück
  
  Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: Shell-Programmierung
Shell-Programmierung
bestellen
 Buchtipps
Zum Rheinwerk-Shop: Shell-Programmierung






 Shell-Programmierung


Zum Rheinwerk-Shop: Linux-Server






 Linux-Server


Zum Rheinwerk-Shop: Das Komplettpaket LPIC-1 & LPIC-2






 Das Komplettpaket
 LPIC-1 & LPIC-2


Zum Rheinwerk-Shop: Linux-Hochverfügbarkeit






 Linux-
 Hochverfügbarkeit


Zum Rheinwerk-Shop: Linux Handbuch






 Linux Handbuch


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
InfoInfo





Copyright © Rheinwerk Verlag GmbH 2005
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern