Eine Lösung ist /home/sp/Blatt/Blatt7/Loesung/testRegex .


$1 ... $9
Unter $1 .. $9 kann auf die ersten 9 Kommandozeilen-Argumente zugegriffen werden. Weitere Argumente müssen durch shift sichtbar gemacht werden. shift schiebt alle Argumente um eine Position nach links. Ausnahmen sind $0 und $1. Der alte Wert von $1 geht verloren, und $0 wird nie geändert.

$#
Anzahl der (gegebenfalls nach shift noch verbliebenen) Argumente.

$@
alle Argumente als einzelne Wörter; ''$@'' ist äquivalent zu "'$1"' "'$2"' ... .

$*
alle Argumente als ein Wort; ''$*'' ist äquivalent zu ''$1 $2 $3  ... '' .

$-
gesetzte Optionen der aktuellen Shell

$?
Exit-Codes des letzten Kommandos


$!
Prozeßnummer des letzten Hintergrund-Kommandos

$$
Prozeßnummer der Shell; wird bei einer Sub-Shell (...) nicht neu gesetzt!

Der einzige Weg, um die Argumente in einer for-Schleife abzuarbeiten, ist:
for i in "$@"
do
echo $i
done

Wichtig sind dabei die Anführungszeichen um $@ (siehe auch  /home/sp/Blatt/Blatt7/Loesung/afg_2 ).

Sowohl das Einschließen von mehreren Kommandos in () als auch in {} haben u.a. den Sinn, die Ausgabe mehrerer Kommandos zu einem Strom zu bündelen , Darüber hinaus unterscheiden sich beide Ansätze aber auch. Siehe dazu /home/sp/Blatt/Blatt7/Loesung/afg_3 und afg_3_run . Ein weiterer in dem Skript afg_3 nicht vorgeführter Unterschied ist das Signalhandling innerhalb von (...) und {...} . In der Sub-Shell gelten, im Gegensatz zum {...}-Konstrukt, durch Aufruf von trap geänderte Behandlungen von Signale in der aufrufenden Shell nicht.

Eine Lösung ist /home/sp/Blatt/Blatt7/Loesung/cmd .

${name}
{...} begrenzen die Variable name gegen den nachfolgenden Text.

${name?message}
${name:?message}
Der Test bezieht sich mit Doppelpunkt darauf, ob die Variable name existiert und keinen leeren Wert besitzt. Ohne Doppelpunkt wird nur Existenz geprüft. Die Doppelpunktbedeutung gilt auch für die nachfolgenden parameter substitutions. Bei negativem Test wird message als Fehlermeldung ausgegeben. Dies scheint in der Bourne-Shell Probleme zu geben:

isolde bernd 842 sh
\h \W \! x=
\h \W \! echo ${x:?"X ist leer!"}
x: ã©Øúû©òïïù¡
\h \W \!

${name=default}
${name:=default}
Hat name einen Wert, so ist der Wert von ${...} der Wert von name. Ansonsten wird der Wert von name und von ${...} auf default gesetzt.

${name-default}
${name:-default}
default, falls name keinen Wert hat; der Inhalt von name bleibt unverändert.

${name+ersatz}
${name:+ersatz}
default, falls name einen Wert hat; der Inhalt von name bleibt unverändert.

Eine Lösung ist /home/sp/Blatt/Blatt7/Loesung afg_5.1 und afg_5.2 .


a)
Wird set ohne Argumente aufgerufen, so werden allen existenten Variablen mit ihrem Wert ausgegeben. Wird set dagegen mit Argumenten (aber ohne Optionen) aufgerufen, so werden die Argumente der Reihe nach den Variablen $1, $2 usw. zugewiesen.

b)
Das Kommando type ist ein builtin-Kommando der Shell und kann daher, im Gegensatz zu which, auch die builtin-Kommandos der Shell kennen und finden. type liefert außerdem Informationen über Funktionen der aktuellen Shell:

isolde bernd 1 sh
\h \W \! PS1='$ '
$ fkt1 () {
> echo Hello World!
> }
$ type fkt1
fkt1 is a function
fkt1(){
echo Hello World!
}
$

Eine Shell-Skript à la which ist /home/sp/Blatt/Blatt7/Loesung/which .

c)
Das Kommando nach && wird nur dann aufgerufen, wenn das Kommando vor && mit einem Exit-Code Null beendet ist. Ein typisches Beispiel ist:

{ cd ~bernd/vorl && tar cf - sp ; } | { cd ~bernd/tmp && tar xf - ; }

Das Kommando nach || wird nur dann aufgerufen, wenn das Kommando vor || mit einem Exit-Code ungleich Null beendet ist. Ein typisches Beispiel ist:

[ $# = 3 ] || echo usage ......


Eine Lösung ist in /home/sp/Blatt/Blatt7/Loesung/testRegex integriert.