(Ich nehme in keiner Weise in Anspruch, dass diese Lösungen auch nur ansatzweise optimal wären.)
Variablen-Zuweisung
${variable}
${variable-wert}
${variable:-wert}
${variable=wert}
${variable:=wert}
${variable+wert}
${variable:+wert}
${variable?wert}
${variable:?wert}
trap action signal [ signal … ]
Ueberschr.
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 25Hmmm ... 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.
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.
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<
$
= 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<
$
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<
$
Beschreibung folgt
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 |
|---|---|---|
| 0 | normale Beendigung des Skripts | |
| 1 | HUP | Hangup, Verbindungsabbruch |
| 2 | INT | üblicherweise CTRL-C |
| 3 | QUIT | üblicherweise CTRL-\ |
| 15 | TERM | Standard-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?)
Beschreibung folgt
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