|
|
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.
|
|
Last modified 03/July/97