Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

 << zurück
Shell-Programmierung von Jürgen Wolf
Einführung, Praxis, Referenz
Buch: Shell-Programmierung

Shell-Programmierung
782 S., mit CD, 44,90 Euro
Rheinwerk Computing
ISBN 3-89842-683-1
gp Kapitel 2 Variablen
  gp 2.1 Grundlagen
    gp 2.1.1 Zugriff auf den Wert einer Variablen
    gp 2.1.2 Variablen-Interpolation
  gp 2.2 Zahlen
    gp 2.2.1 Integer-Arithmetik (Bourne-Shell, Bash und Korn-Shell)
    gp 2.2.2 Integer-Arithmetik (Bash und Korn-Shell only)
    gp 2.2.3 bc – Rechnen mit Fließkommazahlen und mathematische Funktionen
  gp 2.3 Zeichenketten
    gp 2.3.1 Stringverarbeitung
    gp 2.3.2 Erweiterte Funktionen für Bash und Korn-Shell
  gp 2.4 Quotings und Kommando-Substitution
    gp 2.4.1 Single und Double Quotings
    gp 2.4.2 Kommando-Substitution – Back Quotes
  gp 2.5 Arrays (Bash und Korn-Shell only)
    gp 2.5.1 Werte an Arrays zuweisen
    gp 2.5.2 Eine Liste von Werten an ein Array zuweisen (Bash)
    gp 2.5.3 Eine Liste von Werten an ein Array zuweisen (Korn-Shell)
    gp 2.5.4 Zugreifen auf die einzelnen Elemente eines Arrays
  gp 2.6 Variablen exportieren
  gp 2.7 Umgebungsvariablen eines Prozesses
  gp 2.8 Shell-Variablen
  gp 2.9 Automatische Variablen der Shell
    gp 2.9.1 Der Name des Shellscripts – $0
    gp 2.9.2 Die Prozessnummer des Shellscripts – $$
    gp 2.9.3 Der Beendigungsstatus eines Shellscripts – $?
    gp 2.9.4 Die Prozessnummer des zuletzt gestarteten Hintergrundprozesses – $!
    gp 2.9.5 Weitere vordefinierte Variablen der Shell
    gp 2.9.6 Weitere automatische Variablen für Bash und Korn-Shell


Rheinwerk Computing

2.6 Variablen exportieren  toptop

Definieren Sie Variablen in Ihrem Shellscript, so sind diese gewöhnlich nur zur Ausführzeit verfügbar. Nach der Beendigung des Scripts werden die Variablen wieder freigegeben. Manches Mal ist es allerdings nötig, dass mehrere Scripts oder Subshells mit einer einzelnen Variablen arbeiten. Damit das jeweilige Script bzw. die nächste Subshell von der Variable Kenntnis nimmt, wird diese exportiert.

Exportiere Variablen, die Sie in eine neue Shell übertragen möchten, werden mit dem Kommando export übernommen:

export variable

Beim Start der neuen Shell steht die exportierte Variable dann auch zur Verfügung – natürlich mitsamt dem Wert, den diese in der alten Shell belegt hat. In der Bourne-Shell müssen Sie die Zuweisung und das Exportieren einer Variablen getrennt ausführen.

you@host > variable=1234
you@host > export variable

In der Bash und der Korn-Shell können Sie diesen Vorgang zusammenlegen:

you@host > export variable=1234

Natürlich können auch mehr Variablen auf einmal exportiert werden:

you@host > export var1 var2 var3 var4

Die weiteren Variablen, die Sie auf einmal exportieren wollen, müssen mit einem Leerzeichen voneinander getrennt sein.

Die Shell vererbt eine Variable an ein Script (Subshell)

Der einfachste Fall ist gegeben, wenn eine in der Shell definierte Variable auch für ein Shellscript vorhanden sein soll. Da die Shell ja zum Starten von Shellscripts in der Regel eine Subshell startet, weiß die Subshell bzw. das Shellscript nichts mehr von den benutzerdefinierten Variablen. Das Beispiel:

you@host > wichtig="Wichtige Daten"

Das Shellscript:

# Demonstriert den Umgang export
# Name : aexport1
echo "aexport1: $wichtig"

Beim Ausführen von »aexport1« wird bei Verwendung der Variablen »wichtig« ein leerer String ausgegeben. Hier sollte man in der Shell, in der das Script gestartet wird, einen Export durchführen.

you@host > export wichtig
you@host > ./aexport1
aexport1: Wichtige Daten

Und schon steht dem Script die benutzerdefinierte Variable »wichtig« zur Verfügung.

Ein Shellscript vererbt eine Variable an ein Shellscript (Sub-Subshell)

Wenn Sie aus einem Script ein weiteres Script aufrufen und auch hierbei dem aufzurufenden Script eine bestimmte Variable des aufrufenden Scripts zur Kenntnis geben wollen, müssen Sie im aufrufenden Script die entsprechende Variable exportieren.

# Demonstriert den Umgang export
# Name : aexport1
wichtig="Noch wichtigere Daten"
echo "aexport1: $wichtig"
# Variable im Shellscript exportieren
export wichtig
./aexport2

In diesem Script »aexport1« wird ein weiteres Script namens »aexport2« aufgerufen. Damit diesem Script auch die benutzerdefinierte Variable »wichtig« zur Verfügung steht, muss diese im Script zuvor noch exportiert werden. Hier das Script »aexport2«:

# Demonstriert den Umgang export
# Name : aexport2
echo "aexport2: $wichtig"

Die Shellscripts bei der Ausführung:

you@host > ./aexport1
aexport1: Noch wichtigere Daten
aexport2: Noch wichtigere Daten
you@host > echo $wichtig
you@host >

Hier wurde außerdem versucht, in der Shell, die das Shellscript »aexport1« aufgerufen hat, die benutzerdefinierte Variable »wichtig« auszugeben. Das ist logischerweise ein leerer String, da die Shell nichts von einer Variablen wissen kann, die in einer Subshell definiert und ausgeführt wird.

Bei dem Beispiel von eben stellt sich die Frage, was passiert, wenn eine Subshell den Inhalt einer vom Elternprozess benutzerdefinierten exportierten Variable verändert und die Ausführung des Scripts in der übergeordneten Shell fortgeführt wird. Um auf das Anwendungsbeispiel zurückzukommen: Im Script »aexport2« soll die Variable »wichtig« verändert werden. Hierzu nochmals beide Shellscripts etwas umgeschrieben. Zuerst das Script »aexport1«:

# Demonstriert den Umgang export
# Name : aexport1
wichtig="Noch wichtigere Daten"
echo "aexport1: $wichtig"
# Variable im Shellscript exportieren
export wichtig
./aexport2
# Nach der Ausführung von aexport2
echo "aexport1: $wichtig"

Jetzt noch »aexport2«:

# Demonstriert den Umgang export
# Name : aexport2
echo "aexport2: $wichtig"
wichtig="Unwichtig"
echo "aexport2: $wichtig"

Die beiden Scripts wieder bei der Ausführung:

you@host > ./aexport1
aexport1: Noch wichtigere Daten
aexport2: Noch wichtigere Daten
aexport2: Unwichtig
aexport1: Noch wichtigere Daten

An der Ausführung der Scripts konnten Sie ganz klar erkennen, dass es auf herkömmlichem Weg unmöglich ist, die Variablen einer Eltern-Shell zu verändern.

Starten eines Scripts in der aktuellen Shell – Punkte-Kommando

Wollen Sie trotzdem, dass die Eltern-Shell betroffen ist, wenn Sie eine Variable in einer Subshell verändern, dann können Sie das Punkte-Kommando verwenden. Dieses wurden beim Starten von Shellscripts bereits erwähnt. Mit dem Punkte-Kommando vor dem auszuführenden Shellscript veranlassen Sie, dass das Shellscript nicht in einer Subshell ausgeführt wird, sondern von der aktuellen Shell.

Auf das Beispiel »aexport1« bezogen müssen Sie nur Folgendes ändern:

# Demonstriert den Umgang export
# Name : aexport1
wichtig="Noch wichtigere Daten"
echo "aexport1: $wichtig"
# Variable im Shellscript exportieren
. ./aexport2
# Nach der Ausführung von aexport2
echo "aexport1: $wichtig"

Beim Ausführen der Scripts ist jetzt auch die Veränderung der Variablen »wichtig« im Script »aexport2« beim Script »aexport1« angekommen.

Das Hauptanwendungsgebiet des Punkte-Kommandos ist aber das Einlesen von Konfigurationsdateien. Eine Konfigurationsdatei wird häufig verwendet, wenn Sie ein Script für mehrere Systeme oder unterschiedlichste Optionen (bspw. mehrere Sprachen, eingeschränkte oder unterschiedliche Funktionen) anbieten wollen. In solch einer Konfigurationsdatei wird dann häufig die Variablenzuweisung vorgenommen. Dadurch können die Variablen vom eigentlichen Script getrennt werden – was ein Script erheblich flexibler macht. Durch die Verwendung des Punkte-Kommandos bleiben Ihnen diese Variablen in der aktuellen Shell erhalten. Als Beispiel folgende Konfigurationsdatei:

# aconf.conf
lang="deutsch"
prg="Shell"

Und jetzt noch das entsprechende Script, das diese Konfigurationsdatei verwendet:

# Name : apoint
# Konfigurationsdaten einlesen
. aconf.conf
echo "Spracheinstellung: $lang; ($prg)"

Das Script bei der Ausführung:

you@host >  ./apoint
Spracheinstellung: deutsch; (Shell)

Jetzt kann durch ein Verändern der Konfigurationsdatei aconf.conf die Ausgabe des Scripts nach Bedarf verändert werden. Im Beispiel ist dieser Fall natürlich recht belanglos.

Es gibt außerdem noch zwei Anwendungsfälle, wo bei einem Script die benutzerdefinierten Variablen ohne einem Export sichtbar sind. Dies geschieht durch die Verwendung von Kommando-Substitution `...` und bei einer Gruppierung von Befehlen (...). In beiden Fällen bekommt die Subshell (bzw. das Shellscript) eine komplette Kopie aller Variablen der Eltern-Shell kopiert.


Hinweis   Anstelle des Punkte-Operators können Sie auch den Builtin-Befehl script verwenden.


Variablen exportieren – extra (Bash und Korn-Shell only)

Intern wird beim Exportieren einer Variablen ein Flag gesetzt. Dank dieses Flags kann eine Variable an weitere Subshells vererbt werden, ohne dass hierbei weitere export-Aufrufe erforderlich sind. In der Bash oder der Korn-Shell können Sie dieses Flag mithilfe des Kommandos typeset setzen oder wieder entfernen. Um mit typeset eine Variable zu exportieren, wird die Option –x verwendet. Hier die Syntax:

typeset -x variable

Natürlich kann auch hier wieder mehr als nur eine Variable exportiert werden. Ebenso können Sie die Zuweisungen und das Exportieren zusammen ausführen. typeset ist deshalb so interessant für das Exportieren von Variablen, weil Sie hierbei jederzeit mit der Option +x das Export-Flag wieder löschen können.

Umgebungsvariablen exportieren (Bourne-Shell only)

Zwar werden die Umgebungsvariablen noch gesondert behandelt, doch bezüglich der Exportierung hier schon ein paar Bemerkungen. Wichtig ist vor allem zu erwähnen, dass Umgebungsvariablen bei jedem Aufruf einer Shell neu angelegt werden (natürlich als Kopie der Eltern-Shell). Des Weiteren werden bei der Bash und der Korn-Shell die Umgebungsvariablen immer automatisch exportiert und müssen somit nicht explizit angewiesen werden. Geschieht dies trotzdem, ist das kein Fehler – zum Glück, denn die Bourne-Shell exportiert die Umgebungsvariablen leider nicht automatisch.

Hier ein solcher Vorgang in der Bourne-Shell:

sh-2.05b$ echo $USER
you
sh-2.05b$ USER=neu
sh-2.05b$ echo $USER
neu
sh-2.05b$ sh
sh-2.05b$ echo $USER
you

Damit in einer Bourne-Shell auch die aktuellen Umgebungsvariablen bei einer neuen Shell gültig sind, müssen Sie diese explizit exportieren.

sh-2.05b$ echo $USER
you
sh-2.05b$ USER=neu
sh-2.05b$ echo $USER
neu
sh-2.05b$ export USER
sh-2.05b$ sh
sh-2.05b$ echo $USER
neu

Anzeigen exportierter Variablen

Wenn Sie das Kommando export ohne irgendwelche Argumente verwenden, bekommen Sie alle exportierten Variablen zurück. Bei der Bash und Korn-Shell finden Sie darin auch die Umgebungsvariablen wieder, weil diese hier ja immer als »exportiert« markiert sind.

Bei der Bash bzw. der Korn-Shell können Sie sich auch die exportierten Variablen mit dem Kommando typeset und der Option –x (keine weiteren Argumente) ansehen.



Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.

>> Zum Feedback-Formular
 << zurück
  
  Zum Katalog
Zum Katalog: Shell-Programmierung
Shell-Programmierung
bestellen
 Buchtipps
Zum Katalog: Shell-Programmierung






 Shell-Programmierung


Zum Katalog: Linux-Server






 Linux-Server


Zum Katalog: Das Komplettpaket LPIC-1 & LPIC-2






 Das Komplettpaket
 LPIC-1 & LPIC-2


Zum Katalog: Linux-Hochverfügbarkeit






 Linux-
 Hochverfügbarkeit


Zum Katalog: Linux Handbuch






 Linux Handbuch


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo





Copyright © Rheinwerk Verlag GmbH 2005
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de