Auf dieser Seite werden diverse Beispiele für Shell-Programmierung zu finden sein. Abhängig von der zur Verfügung stehenden Zeit werde ich vielleicht auch Knobelaufgaben hier unterbringen. Oder ich stelle Probleme, mit denen ich konfrontiert war, und _meine_ Lösung dazu vor.

(Ich nehme in keiner Weise in Anspruch, dass diese Lösungen auch nur ansatzweise optimal wären.)


Inhalt

Variablen-Zuweisung
${variable}
${variable-wert}
${variable:-wert}

${variable=wert}
${variable:=wert}

${variable+wert}
${variable:+wert}

${variable?wert}
${variable:?wert}

trap action signal [ signal … ]
Ueberschr.


Variablen-Zuweisung

Laut Tricks of the UNIX Masters findet die Zuweisung der Shell-/Umgebungs-Variablen auf der Kommandozeile von rechts nach links statt.

$ a=1
$ b=2 
$ c=3
$ a=$b b=25 c=$b
$ echo $a $b $c
2 25 25
Hmmm ... das hätte ich dann aber doch anders erwartet! Oder ist das (wieder?) nur eine Besonderheit der bash? ksh verhält sich allerdings auch so.

${variable}

Im Normalfall wird beschrieben, dass eine Shell-Variable mit $name abgerufen werden kann. Das ist sicher in weit mehr als 95 % aller Fälle richtig. Aber es gibt auch Gelegenheiten, wo es so einfach nicht mehr geht.

Stellen wir uns ein Szenario vor:
Ich habe (wirklich) ein Shell-Skript, in dem ich mehrere temporäre Dateien brauche. Der Grundstock der Namen dieser Dateien ist in TMP als /tmp/xyz$$ hinterlegt. Die Idee ist nun nach Bedarf noch zusätzlich a, b usw. (oder auch andere Texte) anzuhängen.
Ein Aufruf von $TMPa führt nicht zum gewünschten Ergebnis, weil der Inhalt einer Variable TMPa ausgegeben würde. Also muss zwischen dem TMP und dem a irgendein Trenner eingebaut werden. Dafür kämen sowohl zwei Apostrophen ($TMP''a) als auch zwei Gänsefüßchen ($TMP""a) — jeweils als Platzhalter für einen leeren String — in Frage. Allerdings kann die Lesbarkeit bei Verwendung weiterer Anführungszeichen auf der Zeile deutlich leiden.
Ein Problem, das sich bei der Benutzung von ${TMP}a nicht stellt.

Anfang der Seite

${variable-wert}
${variable:-wert}

Ist die Variable variable definiert, wird ihr Wert zurückgeliefert, andernfalls der Wert wert.
Ist zusätzlich zum - auch noch der Doppelpunkt (:) angegeben, wird auch bei definierter, aber leerer Variable variable der Wert wert abgeliefert.

	$ unset eins zwei
	$ echo ">$eins< >$zwei<"
	>< ><
	$ echo ">${eins-neuer}< >${zwei:-Wert}<"
	>neuer< >Wert<
	$ echo ">$eins< >$zwei<"
	>< ><
	$ 

	$ eins="" zwei=""
	$ echo ">$eins< >$zwei<"
	>< ><
	$ echo ">${eins-neuer}< >${zwei:-Wert}<"
	>< >Wert<
	$ echo ">$eins< >$zwei<"
	>< ><
	$ 

	$ eins="alter" zwei="Hut"
	$ echo ">$eins< >$zwei<"
	>alter< >Hut<
	$ echo ">${eins-neuer}< >${zwei:-Wert}<"
	>alter< >Hut<
	$ echo ">$eins< >$zwei<"
	>alter< >Hut<
	$ 

Anfang der Seite

${variable=wert}
${variable:=wert}

= verhält sich wie -, allerdings mit dem Unterschied, dass wert nicht nur zurückgeliefert, sondern zugleich an variable zugewiesen wird.

Mit dieser Technik sorge ich üblicherweise dafür, dass nach

	:	${HOST:=`hostname`}
in HOST in jedem Fall etwas drinsteht; entweder stand vorher schon was drin oder der aktuelle Rechnername wurde gerade eben reingeschrieben

Analog oben:

	$ unset eins zwei
	$ echo ">$eins< >$zwei<"
	>< ><   
	$ echo ">${eins=neuer}< >${zwei:=Wert}<"
	>neuer< >Wert<
	$ echo ">$eins< >$zwei<"
	>neuer< >Wert<
	$ 

	$ eins="" zwei="" 
	$ echo ">$eins< >$zwei<"
	>< ><   
	$ echo ">${eins=neuer}< >${zwei:=Wert}<"
	>< >Wert<
	$ echo ">$eins< >$zwei<"
	>< >Wert<
	$ 

	$ eins="alter" zwei="Hut"
	$ echo ">$eins< >$zwei<"
	>alter< >Hut<
	$ echo ">${eins=neuer}< >${zwei:=Wert}<"
	>alter< >Hut<
	$ echo ">$eins< >$zwei<"
	>alter< >Hut<
	$ 

Anfang der Seite

${variable+wert}
${variable:+wert}

Ist die Variable variable definiert, wird der Wert wert zurückgeliefert, andernfalls nichts.
Ist zusätzlich zum + auch noch der Doppelpunkt (:) angegeben, findet auch bei definierter, aber leerer Variable variable kein Textersatz statt.

	$ unset eins zwei
	$ echo ">$eins< >$zwei<"
	>< ><
	$ echo ">${eins+neuer}< >${zwei:+Wert}<"
	>< ><
	$ echo ">$eins< >$zwei<"
	>< ><
	$ 

	$ eins="" zwei=""
	$ echo ">$eins< >$zwei<"
	>< ><
	$ echo ">${eins+neuer}< >${zwei:+Wert}<"
	>neuer< ><
	$ echo ">$eins< >$zwei<"
	>< ><
	$ 

	$ eins="alter" zwei="Hut"
	$ echo ">$eins< >$zwei<"
	>alter< >Hut<
	$ echo ">${eins+neuer}< >${zwei:+Wert}<"
	>neuer< >Wert<
	$ echo ">$eins< >$zwei<"
	>alter< >Hut<
	$ 

Anfang der Seite

${variable?wert}
${variable:?wert}

Beschreibung folgt

Anfang der Seite

trap action signal [ signal … ]

Mit der Vokabel trap können in der Shell-Programmierung Signale abgefangen werden. Im Rahmen dieses Aufschreibens stelle ich fest, dass sich an dieser Front anscheinend einiges ge-/verändert hat. Da werde ich mich wohl demnächst mal aufschlauen müssen …

Vorläufig mal nur, wie ich es bisher verwende:

	TMP="/tmp/abcd"

	trap "trap '' 0; rm -f '${TMP}'" 0 1 2 3 15


	echo hier passiert im Ernstfall wirklich was ...


	exit 0
Mit TMP=… wird der Name der temporären Datei festgelegt. Dazu kann man auch TMP=`mktemp` verwenden; dann wird die Datei gleich auf gesicherte Art angelegt und man braucht sich nicht selber darum kümmern, dass einem kein böser Bube dazwischenfunkt. Allerdings muss man dann aber dafür sorgen, dass die Datei bei Beendigung des Skripts verschwindet.

Signal Name Beschreibung
0normale Beendigung des Skripts
1HUPHangup, Verbindungsabbruch
2INTüblicherweise CTRL-C
3QUITüblicherweise CTRL-\
15TERMStandard-Signal bei kill

Zwischen den Gänsefüßchen steht die auszuführende Aktion. Der wesentliche Teil ist das rm -f '${TMP}', das die temporäre Datei löscht. Das trap '' 0; davor wurde früher in alten Shells gebraucht, weil die unter Umständen sonst in einer Endlosschleife immer wieder versucht haben die temporäre Datei (nochmal) zu löschen.

Das exit 0 am Ende des Skripts ist ebenso ein Relikt aus alten Zeiten; mindestens eine Shell war mir untergekommen, die nur damit überredet werden konnte bei Beendigung ihre temporären Dateien sauber abzuräumen.

(Wieso komme ich mir gerade wie ein Dinosaurier vor?)

Anfang der Seite

Ueberschr.

Beschreibung folgt

Anfang der Seite


Disclaimer:

Die auf diesen Seiten zum Ausdruck gebrachten Meinungen sind die meinigen, nicht notwendigerweise die der Universität Osnabrück. (Es sei denn, sie würden zufällig übereinstimmen oder wären entsprechend gekennzeichnet.)

Zum Thema "Links":

Bei "Links" handelt es sich stets um "lebende" (dynamische) Verweisungen. Gernot Skalla hat bei der erstmaligen Verknüpfung zwar den fremden Inhalt daraufhin überprüft, ob durch ihn eine mögliche zivilrechtliche oder strafrechtliche Verantwortlichkeit ausgelöst wird. Er überprüft aber die Inhalte, auf die er in seinem Angebot verweist, nicht ständig auf Veränderungen, die eine Verantwortlichkeit neu begründen könnten. Wenn er feststellt oder von anderen darauf hingewiesen wird, daß ein konkretes Angebot, zu dem er einen Link bereitgestellt hat, eine zivil- oder strafrechtliche Verantwortlichkeit auslöst, wird er den Verweis auf dieses Angebot aufheben.

(Quelle: Impressum/Disclaimer des Berliner Beauftragten für Datenschutz und Informationsfreiheit Stand: 09/2002)

Last change: Tue Jul 28 15:19:34 CEST 2015