2.5 Arrays (Bash und Korn-Shell only)
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.
2.5.1 Werte an Arrays zuweisen
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.
2.5.2 Eine Liste von Werten an ein Array zuweisen (Bash)
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.
2.5.3 Eine Liste von Werten an ein Array zuweisen (Korn-Shell)
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.
2.5.4 Zugreifen auf die einzelnen Elemente eines Arrays
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
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.
|