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.5 Arrays (Bash und Korn-Shell onlydowntop

Mit Arrays haben Sie die Möglichkeit, eine geordnete Folge von Werten eines bestimmten Typs abzuspeichern und zu bearbeiten. Arrays werden auch als Vektoren, Felder oder Reihungen bezeichnet. Allerdings können Sie in der Shell-Programmierung nur eindimensionale Arrays erzeugen bzw. verwenden. Der Zugriff auf die einzelnen Elemente des Arrays erfolgt mit ${variable[x]}. x steht hier für die Nummer (nicht negative, ganze Zahl) des Feldes (wird auch als Feldindex bezeichnet), welches Sie ansprechen wollen. Bevorzugt werden solche Arrays in Schleifen verwendet. Anstatt nämlich auf einen ganzen Satz von einzelnen Variablen zurückzugreifen, nutzt man hier bevorzugt Arrays.

Einige Wermutstropfen gibt es allerdings doch noch: Die Bourne-Shell kennt nichts dergleichen und auch die Korn-Shell kommt teilweise nicht mit der Bash überein. Zwar erfolgt die Anwendung von Arrays selbst bei den beiden Shells in gleicher Weise, aber bei der Zuweisung von Arrays gehen auch hier beide Vertreter in eine andere Richtung.


Rheinwerk Computing

2.5.1 Werte an Arrays zuweisen  downtop

Wenn Sie einen Wert in ein Feld-Array schreiben wollen, müssen Sie lediglich den Feldindex angeben.

you@host > array[3]=drei

Hier haben Sie das dritte Feld von »array« mit der Zeichenkette »drei« belegt. Jetzt stellt sich bei den etwas programmiererprobten Lesern sicherlich die Frage, was mit den anderen Elementen davor ist. Hier kann ich Sie beruhigen, in der Shell-Programmierung dürfen die Felder Lücken enthalten. Zwar beginnt man der Übersichtlichkeit zuliebe bei dem Feldindex 0, aber es geht eben auch anders.

you@host > array[0]=null
you@host > array[1]=zwei
you@host > array[2]=zwei
you@host > array[3]=drei
...

Hinweis   Das erste Element in einem Array hat immer den Feldindex 0!


Im Unterschied zu anderen Programmiersprachen müssen Sie in der Shell das Array nicht vor der Verwendung bekannt geben (deklarieren). Es gibt dennoch Gründe, dies trotzdem zu tun. Zum einen kann man damit angeben, dass die Werte innerhalb eines Arrays als Integer gültig sein sollen (typeset –i array) und zum anderen können Sie ein Array so mit Schreibschutz versehen (typeset –r array).


Hinweis   In vielen Büchern wird in der Bash ein Array mit typeset -a array als ein Array ohne spezielle Typen deklariert. Da Arrays in der Bash automatisch erstellt werden, ist dies unnötig (aber nicht falsch).


Gewöhnlich werden Sie beim Anlegen eines Arrays dieses mit mehreren Werten auf einmal versehen wollen. Leider gehen hier die Shells ihre eigenen Wege.


Rheinwerk Computing

2.5.2 Eine Liste von Werten an ein Array zuweisen (Bash)  downtop

Die Syntax:

array=(null eins zwei drei vier fuenf ...)

Bei der Zuweisung beginnt der Feldindex automatisch bei 0, somit wäre array[0] mit dem Inhalt »null« beschrieben. Dennoch ist es auch möglich, eine solche Zuweisung an einer anderen Position zu starten.

array=([2]=zwei drei)

Trotzdem hilft Ihnen diese Möglichkeit nicht, an das Array hinten etwas anzuhängen. Hierbei wird ein existierendes Array trotzdem komplett überschrieben. Die Anzahl der Elemente, die Sie einem Array übergeben können, ist bei der Bash beliebig. Als Trennzeichen zwischen den einzelnen Elementen fungiert ein Leerzeichen.


Rheinwerk Computing

2.5.3 Eine Liste von Werten an ein Array zuweisen (Korn-Shell)  downtop

In der Korn-Shell bedienen Sie sich des Kommandos set und der Option –A (für Array), um eine ganze Liste von Werten einem Array zuzuweisen. Hier die Syntax:

set -A array null eins zwei drei vier fuenf ...

Im Gegensatz zur Bash können Sie hier allerdings keinen bestimmten Feldindex angeben, von dem aus die Zuweisung des Arrays erfolgen soll. Ebenso finden Sie in der Korn-Shell eine Einschränkung bezüglich der Anzahl von Elementen vor, die ein Array belegen darf. Gewöhnlich sind hierbei 512, 1024 oder maximal 4096 Werte möglich.


Rheinwerk Computing

2.5.4 Zugreifen auf die einzelnen Elemente eines Arrays  toptop

Hier kommen die beiden Shells zum Glück wieder auf einen Nenner. Der Zugriff auf ein einzelnes Element im Array erfolgt über folgende Syntax:

${array[n]}

n entspricht dabei dem Feldindex, auf dessen Wert im Array Sie zurückgreifen wollen. Der Zugriff auf ein Array muss leider in geschweiften Klammern erfolgen, da hier ja mit den Zeichen [ ] Metazeichen verwendet wurden und sonst eine Expansion der Shell durchgeführt würde.

Alle Elemente eines Arrays auf einmal und die Anzahl der Elemente ausgeben

Alle Elemente eines Arrays können Sie mit folgenden Schreibweisen ausgeben lassen:

you@host > echo ${array[*]}
you@host > echo ${array[@]}

Auf den Unterschied dieser beiden Versionen ($* und $@) wird in Kapitel 3, Parameter und Argumente, eingegangen.

Die Anzahl der belegten Elemente im Array erhalten Sie mit:

you@host > echo ${#array[*]}

Wollen Sie feststellen, wie lang der Eintrag innerhalb eines Arrays ist, so gehen Sie genauso vor wie beim Ermitteln der Anzahl belegter Elemente im Array, nur dass Sie hierbei den entsprechenden Feldindex verwenden.

you@host > echo ${#array[1]}

Löschen einzelner Elemente oder des kompletten Arrays

Beim Löschen eines Elements im Array oder gar des kompletten Arrays wird derselbe Weg wie schon bei den Variablen beschritten. Hier hilft Ihnen das Kommando unset wieder aus. Das komplette Array löschen Sie mit:

you@host > unset array

Einzelne Elemente können Sie mit folgender Syntax herauslöschen (im Beispiel das zweite Element):

you@host > unset array[2]

Komplettes Array kopieren

Wollen Sie ein komplettes Array kopieren, dann können Sie entweder jedes einzelne Element in einer Schleife durchlaufen, überprüfen und einem anderen Array zuweisen. Oder aber Sie verwenden ein ähnliches Konstrukt wie beim Auflisten aller Elemente in einem Array, verbunden mit dem Zuweisen einer Liste mit Werten an ein Array – was bedeutet, dass hier wieder Bash und Korn-Shell extra behandelt werden möchten (müssen).

Bei der Bash realisieren Sie dies so:

array_kopie=(${array_quelle[*]})

Und die Korn-Shell will das so haben:

set -A array_kopie ${array_quelle[*]}

Achtung: Hierbei gibt es noch eine üble Stolperfalle. So löscht man beispielsweise in der Bash array[1] mit unset und kopiert dann das array, so steht in array_kopie[1] der Inhalt von array[2].


String-Manipulationen

Selbstverständlich stehen Ihnen hierzu auch die String-Manipulationen zur Verfügung, die Sie in diesem Kapitel kennen gelernt haben. Wollen Sie diese einsetzen, müssen Sie aber überdenken, ob sich die Manipulation auf ein einzelnes Feld beziehen soll (${array[n]) oder ob Sie das komplette Array (${array[*]}) dafür heranziehen wollen. Auch die in der Bash vorhandene cut-ähnliche Funktion ${array[n]1:2 (oder alle Elemente: ${array[*]1:2}) steht Ihnen bereit.

Zugegeben, es ließe sich noch einiges mehr zu den Arrays schreiben, doch hier begnüge ich mich mit dem für den Hausgebrauch Nötigen. Auf Arrays in Zusammenhang mit Schleifen wird noch in Kapitel eingegangen.

Zum besseren Verständnis möchte ich Ihnen ein etwas umfangreicheres Script zeigen, das Ihnen alle hier beschriebenen Funktionalitäten eines Arrays nochmals in der Praxis zeigt. Vorwegnehmend wurde hierbei auch eine Schleife eingesetzt. Im Beispiel wurde der Bash-Version der Vortritt gegeben. Sofern Sie das Beispiel in einer Korn-Shell testen wollen, müssen Sie in den entsprechenden Zeilen (Zuweisung eines Arrays und das Kopieren) das Kommentarzeichen # entfernen und die entsprechenden Zeilen der Bash-Version auskommentieren.

# Demonstriert den Umgang mit Arrays
# Name : aarray
# Liste von Werten in einem Array speichern
# Version: Korn-Shell (auskommentiert)
set -A array null eins zwei drei vier fuenf
# Version: Bash
array=( null eins zwei drei vier fuenf )
# Zugriff auf die einzelnen Elemente
echo ${array[0]}        # null
echo ${array[1]}        # eins
echo ${array[5]}        # fuenf
# Alle Elemente ausgeben
echo ${array[*]}
# Länge von Element 3 ermitteln
echo ${#array[2]}       # 4
# Anzahl der Elemente ausgeben
echo ${#array[*]}
# Neues Element hinzufügen
array[6]="sechs"
# Anzahl der Elemente ausgeben
echo ${#array[*]}
# Alle Elemente ausgeben
echo ${array[*]}
# Element löschen
unset array[4]
# Alle Elemente ausgeben
echo ${array[*]}
# Array kopieren
# Version: ksh (auskommentiert)
#set -A array_kopie=${array[*]}
# Version: Bash
array_kopie=(${array[*]})
# Alle Elemente ausgeben
echo ${array_kopie[*]}
# Schreibschutz verwenden
typeset -r array_kopie
# Versuch, darauf zuzugreifen
array_kopie[1]=nixda
# Vorweggenommen – ein Array in einer for-Schleife
# Einen Integer machen
typeset -i i=0 max=${#array[*]}
while (( i < max ))
do
   echo "Feld $i: ${array[$i]}"
   i=i+1
done

Das Beispiel bei der Ausführung:

you@host > ./aarray
null
eins
fuenf
null eins zwei drei vier fuenf
4
6
7
null eins zwei drei vier fuenf sechs
null eins zwei drei fuenf sechs
null eins zwei drei fuenf sechs
./aarray: line 48: array_kopie: readonly variable
Feld 0: null
Feld 1: eins
Feld 2: zwei
Feld 3: drei
Feld 4:
Feld 5: fuenf


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