next | next | up | down | Inhalt | Uebungen | Complete | Kommentar

all, section 6.6.

6.6.  Textersatz für Argumente

Argumente sind $1 bis $9. Der Name des Shell-Skripts selbst ist $0; er kann Pfadanteile enthalten. Das folgende Skript gibt seine Eingabe n-spaltig aus, wobei n der Name des Skripts ist:

#!/bin/sh
pr -t -l1 -`basename $0`

Argumente stammen aus der Kommandozeile, das heißt, der Systemaufruf execv(const char * pfad, const char * argv []); ersetzt den Programmtext des aufrufenden Prozesses durch das Programm in der Datei pfad und übergibt den Vektor argv[] samt seinen Zeichenketten an das neue Hauptprogramm. Der Speicherbedarf des Vektors und der Zeichenketten, also die Länge der expandierten Kommandozeile, ist begrenzt kann aber relativ groß sein.

Alle Argumente (auch mehr als 9) sind durch $* oder $@ erreichbar. "$*" liefert sie als ein Wort, verkettet mit Leerzeichen. "$@" liefert sie als ein Argument pro Wort:

 1      #!/bin/sh
 2      
 3      for i in $*
 4      do
 5              echo '$*:' $i
 6      done
 7      echo "----------------"
 8      
 9      for i in "$*"
10      do
11              echo '"$*":' $i
12      done
13      echo "----------------"
14      
15      for i in $@
16      do
17              echo '$@:' $i
18      done
19      echo "----------------"
20      
21      for i in "$@"
22      do
23              echo '"$@":' $i
24      done
25      
26      exit 0

$ 6.args a b
$*: a
$*: b
----------------
"$*": a b
----------------
$@: a
$@: b
----------------
"$@": a
"$@": b
$ 6.args "A B"
$*: A
$*: B
----------------
"$*": A B
----------------
$@: A
$@: B
----------------
"$@": A B

Argumente können auch mit set gesetzt werden:

$ set `date`; echo $4 17:14:29

shift verschiebt alle Argumente nach links, eventuell um mehrere Positionen:

$ shift `expr $# - 1`; echo $1
1997

Eine Funktion verwendet die gleichen Argumente wie die Shell selbst, das heißt, ein Funktionsaufruf hat praktisch set als Nebeneffekt:

$ f()
> { shift $1; }
$ f 3 a b c d e; echo $*
c d e

Alle Argumente (auch mehr als 9) sind durch $* oder $@ erreichbar. "$*" liefert sie als ein Wort, verkettet mit Leerzeichen. "$@" liefert sie als ein Argument pro Wort:

$ echo heute > a; echo morgen > b; echo jetzt > 'a b'; ls
a    a b  b
$ cat *
heute
jetzt
morgen
$ set *; cat "$@"
heute
jetzt
morgen
$ cat $*
heute
heute
morgen
morgen
$ cat "$*"
cat: a a b b: No such file or directory

Vorsicht: leere Anführungszeichen erzeugen leere Argumente; nicht alle Kommandos reagieren vernünftig auf leere Argumente:

$ e() { ed "$@"; }
$ e a
6
q
$ e          # leert Argumentliste
?
q
$ ls "$@"
a    a b  b
$ rm -i "$@"	leeres Argument
rm: : is a directory
$ rm -i ${1:+"$@"}	kein Argument
Try `rm --help' for more information.


back | next | up | down | Inhalt | Uebungen | Complete | Kommentar


Created by unroff & hp-tools. © by Hans-Peter Bischof. All Rights Reserved (1997).

Last modified 03/July/97