Bash-Arrays ausführlich

Bash-Arrays ausführlich
In Bash kann ein Array ein indiziertes Array oder ein assoziatives Array sein. Ein indiziertes Array ist eine Liste, deren Elemente ab Null nummeriert sind. Ein assoziatives Array ist eine Liste. Nehmen Sie einen Stift, ein Übungsbuch, ein Lehrbuch, ein Herrscher, 42 US -Dollar und einen Bleistift auf einer Studientabelle an. Diese 6 Elemente können wie folgt als Liste geschrieben werden:
  1. Stift
  2. Übungsheft
  3. Lehrbuch
  4. Herrscher
  5. 42
  6. Bleistift

Dies ist ein Beispiel für ein indiziertes Array. Es gibt 6 Elemente, aber die Elemente wurden von Null bis 5 nummeriert. Die Nummerierung auf diese Weise ist die Indexierung. Indexzählung in Bash beginnt von Null und nicht 1.

Jedes dieser Produkte wird aus einem Hauptmaterial hergestellt. Eine Liste des Hauptmaterials, gefolgt von seinem fertigen Produkt, lautet:

Tinte => Stift
Softpapier => Übungsbuch
Hardpapier => Lehrbuch
Plastik => Lineal
Spezialpapier => 42
Holz => Bleistift

Dies ist ein Beispiel für ein assoziatives Array. Es reicht nicht aus, diese Arrays einfach in eine Bash -Datei einzugeben. Eine der verschiedenen Arten von Arrays muss codiert werden. Die Codierung eines indizierten Arrays ähnelt der Codierung eines assoziativen Arrays. Es gibt jedoch kleine, aber wichtige Unterschiede. Dieser Artikel gibt einen detaillierten Blick auf Bash-Arrays.

Artikelinhalt

  • Indexiertes Array
  • Assoziatives Array
  • Abschluss

Indexiertes Array

Erstellen eines indizierten Arrays

Eine Möglichkeit, das oben idexierte Array zu erstellen, ist wie folgt:

arr = (Pen 'Training Book' "Lehrbuch" Lineal 42 Bleistift)

Hier ist ARR der Name des Arrays. Der Programmierer hätte einen anderen Namen geben können. Leerzeichen trennen die verschiedenen Elemente in der Array -Liste. Wenn ein Artikel aus mehr als einem Wort besteht. Der Index für den Stift beträgt 0; Der Index des "Übungsbuchs" ist 1; Der Index für „Lehrbuch“ ist 2; Der Index für Herrscher beträgt 3; Der Index für 42 ist 4; Der Index für Bleistift beträgt 5.

Eine andere Möglichkeit, das obige Array zu erstellen, beginnt wie folgt:

arr [2] = "Lehrbuch"

Das heißt, das Array wird erstellt, beginnend mit jedem Element in der Liste. '2' in den Quadratklammern wird als Index bezeichnet. Die anderen Elemente können später wie folgt aufgenommen werden:

arr [0] = Stift
arr [1] = 'Übungsbuch' '
arr [3] = Herrscher
arr [4] = 42
arr [5] = Bleistift

Beachten Sie, dass in der Aufnahme das INDEX 2 -Element nicht wiederholt wurde.

Eine andere Möglichkeit, das obige Array zu erstellen, ist wie folgt:

Declare -a arr

Hier ist „Declare“ ein zurückhaltendes Wort. '-a' bedeutet ein indiziertes Array. "Arr" ist der Name der Wahl des Programmierers. Alle Elemente können dann wie folgt aufgenommen werden:

arr [0] = Stift
arr [1] = 'Übungsbuch' '
arr [2] = "Lehrbuch"
arr [3] = Herrscher
arr [4] = 42
arr [5] = Bleistift

Dies ist die Aufnahme durch Zuordnung. Denken Sie daran, wenn ein Wert einer Variablen zugewiesen wird, sollte zwischen dem Zuordnungsoperator = und der Variablen oder dem Wert keinen Platz bestehen.

Referenzieren in indiziertem Element

Die Syntax auf ein Element lautet:

$ name [einschreibend]

Wo der Name der Name des Arrays ist, wie beispielsweise arr. Index ist eine Ganzzahl (Nummer).

Positive Indizes

Die Indexzählung beginnt normalerweise von Null. Im folgenden Code werden die Werte der Elemente gelesen und angezeigt:

arr = (Pen 'Training Book' "Lehrbuch" Lineal 42 Bleistift)
für ((i = 0; i < 6; ++i)); do
echo $ arr [i]
Erledigt

Die Ausgabe ist:

Stift
Übungsheft
Lehrbuch
Herrscher
42
Bleistift

Sechs Elemente beginnen von Index Null bis Index 5. Die Iteration erfolgt also 6 Mal und nicht 5 Mal.

Negative Indizes

Negative Indizes können zum Zugriff auf Elemente verwendet werden. In diesem Fall bezieht sich -1 auf das letzte Element; -2 bezieht sich auf das letzte, aber ein Element; -3 bezieht sich auf das Element vor dem letzten, aber ein Element und so weiter. Für das obige Array bezieht sich also -6 auf das erste Element. Der folgende Code zeigt dies:

arr = (Pen 'Training Book' "Lehrbuch" Lineal 42 Bleistift)
für ((i = -1; i> = -6; -i)); Tun
echo $ arr [i]
Erledigt

Die Ausgabe ist:

Bleistift
42
Herrscher
Lehrbuch
Übungsheft
Stift

Die Anzeige ist in umgekehrter Reihenfolge.

Anzeige aller Elemente im indizierten Array

Um alle Elemente anzuzeigen, kann $ name [*] oder $ name [@] verwendet werden. In diesen Ausdrücken, * oder @ befindet sich an der Stelle des Index. Und damit werden die Werte der im Array vorhandenen Elemente der Elemente, anstatt die Werte von Elementen zurückzugeben, zurückgegeben. Der folgende Code zeigt dies:

Declare -a arr
arr [1] = 'Übungsbuch' arr [3] = Lineal arr [5] = Bleistift
echo $ arr [@]
echo $ arr [*]

Die Ausgabe ist,
Übungsbuch Herrscher Bleistift
Übungsbuch Herrscher Bleistift

Beachten Sie, dass @ und * auf diese Weise verwendete Synonyme sind. Es gibt ein Problem mit der Ausgabe: Die Phrasen sind durch Leerzeichen getrennt und können nicht unterschieden werden. Der folgende Code sollte die Phrasen mit Kommas trennen:

Declare -a arr
arr [1] = 'Übungsbuch' arr [3] = Lineal arr [5] = Bleistift
Ifs =,
echo "$ arr [@]"
echo "$ arr [*]"

Die Ausgabe ist jetzt:

Übungsbuch Herrscher Bleistift
Übungsbuch, Herrscher, Bleistift

IFS bedeutet internes Feldabscheider. Es wurde ein Komma zugewiesen. Beachten Sie die Verwendung von Doppelzitaten für $ arr [@] und $ arr [*] in den Echo -Befehlen. Kommas wurden für das * ein?. Es gibt noch ein weiteres Problem: In der zweiten Ausgabelinie, in der Kommas eingesetzt wurden, wurden keine Räume angezeigt. Also, @ und * sind nicht die ganze Zeit Synonyme. Es ist jedoch möglich, sich mit Komma und Raum zu trennen - siehe unten.

Anzeigen von Indizes des indizierten Arrays

Der Ausdruck $ !Name [@] oder $ !Name [*] Gibt die Indizes eines Arrays als Liste zurück, die durch Leerzeichen getrennt sind. Beachten Sie die Verwendung und Position des Ausrufezeichens (Ausrufezeichen (!). Der folgende Code zeigt die Verwendung dieser Ausdrücke:

arr [1] = 'Übungsbuch' arr [3] = Lineal arr [5] = Bleistift
echo $ !arr [@]
echo $ !arr [*]

Die Ausgabe ist:
1 3 5
1 3 5

Länge des indizierten Arrays

Die Länge des Arrays ist gegeben durch:

$ #name [einschreibend]

Wo Name der Name wie arr ist, den der Programmierer dem Array gab; Das Index ist der höchste Index (Länge - 1) für das Element, dessen Wert festgelegt ist. Beachten Sie die Verwendung und Position des Symbols, #. Der folgende Code zeigt dies:

arr = (Pen 'Training Book' "Lehrbuch" Lineal 42 Bleistift)
echo $ #arr [5]

Die Ausgabe ist 6. Auch wenn einige oder alle unteren Elemente nicht vorhanden sind, wäre die Länge immer noch am höchsten_index + 1. Der folgende Code zeigt dies:

Declare -a arr
arr [3] = Herrscher
arr [5] = Bleistift
echo $ #arr [5]

Die Ausgabe ist immer noch 6, obwohl kein Element für Index 0, Index 1, Index 2 und Index 4 vorhanden ist.

Anzahl der Elemente des indizierten Arrays

Wie oben zu sehen, kann die Anzahl der Elemente im Array geringer sein als die Länge des Arrays. Dies liegt daran, dass die Werte einiger Elemente unter dem letzten Element nicht erstellt oder nicht festgelegt wurden. Der Ausdruck gibt die Anzahl der Elemente an, die in einem indizierten Array festgelegt sind, $ #arr [@] oder $ #arr [*], wie im folgenden Code gezeigt:

arr [1] = 'Übungsbuch' arr [3] = Lineal arr [5] = Bleistift
echo $ #arr [@]
echo $ #arr [*]

Die Ausgabe ist:

3
3

Anzeige nur indizierter Array -Setelemente

Ein Indexelement hat ein Wert zugewiesen, während das nicht zugewiesene Wert nicht festgelegt ist. Der folgende Code zeigt nur die festgelegten Werte an:

arr [1] = 'Übungsbuch' arr [3] = Lineal arr [5] = Bleistift
für ((i = 0; i < $#arr[5]; ++i)); do
Wenn [ ! -z "$ arr [i]"]; Dann
printf "$ arr [i]", "
fi
Erledigt
Echo

Die Ausgabe ist:

Übungsbuch, Herrscher, Bleistift,

Beachten Sie, wie die unbegründeten Elemente identifiziert und aus der Iteration in der Bedingung beseitigt wurden. Beachten Sie auch, dass $ arr [i] in diesem Zustand in doppelten Quoten als "$ arr [i]" ist, damit Werte, die Leerzeichen enthalten, gedruckt werden können. Der Befehl printf ähnelt dem Befehl echo, fügt jedoch nach der Anzeige keine neue Zeile hinzu. Es war möglich, die Werte am Ausgang mit einem Komma und Raum in einer Zeile zu trennen. Das letzte Echo würde dazu führen, dass die nächste Ausgabe in die nächste Zeile geht.

Eine einfachere Form des obigen Codes lautet wie folgt:

arr [1] = 'Übungsbuch' arr [3] = Lineal arr [5] = Bleistift
denn ich in $ !arr [@]; Tun
printf "$ arr [i]", "
Erledigt
Echo

Der Ausgang ist der gleiche. Beachten Sie den Ausdruck für die Liste nach dem reservierten Wort in. Dieser Ausdruck gibt die Liste der Indizes zurück. Hier besteht also keine Notwendigkeit für die Bedingung.

Einstellung und verunreinigte indizierte Elemente und sein Array

Jedes indizierte Element, dem kein Wert zugewiesen wurde. Ein indiziertes Element, dessen Wert zugewiesen wird, ist festgelegt. Jetzt kann ein Element absichtlich nicht festgelegt sein, wie das folgende Skript zeigt:

arr [1] = 'Übungsbuch' arr [3] = Lineal arr [5] = Bleistift
Uneingestellter arr [3]
denn ich in $ !arr [@]; Tun
printf "$ arr [i]", "
Erledigt
Echo

Die Ausgabe ist:

Übungsbuch, Bleistift,

"Herrscher" wurde nicht angezeigt. Die Syntax, um ein Element abzubauen, lautet:

Nicht festgelegter ArrayName [Index]

Die Syntax zum Entfernen oder Verunreinigen des gesamten Arrays lautet:

Nicht fester ArrayName

oder

Nicht fester ArrayName [@]

oder

Nicht fester ArrayName [*]

Im folgenden Code ist das gesamte Array nicht festgelegt:

arr = (Pen 'Training Book' "Lehrbuch" Lineal 42 Bleistift)
Uneingestellter arr
echo "$ arr [*]"

Die Ausgabe ist nichts (eine leere Linie), weil das gesamte Array nicht festgelegt wurde.

Assoziatives Array

Wie oben angegeben, lautet ein Beispiel für ein auf Papier geschriebenes assoziatives Array:

Tinte => Stift
Softpapier => Übungsbuch
Hartpapier => Lehrbuch
Plastik => Lineal
Spezialpapier => 42
Holz => Bleistift

Es gibt 6 Elemente, die jeweils aus einem Schlüssel-/Wertpaar bestehen. Für das erste Element ist „Tinte“ der Schlüssel und „Stift“ ist der Wert; Für das zweite Element ist „Soft Paper“ der Schlüssel und das „Übungsbuch“ der Wert; usw.

Erstellen eines assoziativen Arrays

Eine Möglichkeit, das obige Array zu erstellen, ist wie folgt:

Declare -a arr = ([Ink] = Stift [Weichpapier] = 'Übungsbuch' [Hardpapier] = "Textbuch" [Kunststoff] = Lineal [Spezialpapier] = 42 [Holz] = Bleistift)

Hier ist ARR der Name des Arrays. Der Programmierer hätte einen anderen Namen geben können. Leerzeichen trennen die verschiedenen Elemente in der Array -Liste. Wenn ein Wert aus mehr als einem Wort besteht. Ein Schlüssel kann aus mehr als einem Wort bestehen. In diesem codierten assoziativen Array enthält 6 Schlüssel-/Wertpaare. Ein Schlüssel wird in quadratischen Klammern platziert. Der Wert wird dem Schlüssel mit dem Zuordnungsoperator zugewiesen. '-A' bedeutet assoziatives Array, und es sollte da sein.

Eine andere Möglichkeit, das obige Array zu erstellen, beginnt wie folgt:

Declare -a arr

Hier ist „Declare“ ein zurückhaltendes Wort. '-A' bedeutet assoziatives Array (während '-a' ein indiziertes Array bedeutet). "Arr" ist der Name der Wahl des Programmierers. Elemente können dann wie folgt aufgenommen werden:

Declare -a arr
arr [Soft Paper] = 'Übungsbuch' '
arr [Plastik] = Lineal
arr [Holz] = Bleistift

Alle Elemente (6) sollten nicht unbedingt gleichzeitig einbezogen werden. Der Rest kann später hinzugefügt werden. Dies wird durch Zuordnung hinzugefügt. Denken Sie daran, wenn ein Wert einer Variablen zugewiesen wird, sollte zwischen dem Zuordnungsoperator = und der Variablen oder dem Wert keinen Platz bestehen.

Referenzierung des assoziativen Array -Elements

Die Syntax auf ein assoziatives Array -Element lautet:

$ name [einschreibend]

Wo der Name der Name des Arrays ist, wie beispielsweise arr. Der Index ist der Schlüssel in Textformular. Im folgenden Code werden die Werte der Elemente gelesen und angezeigt:

Declare -a arr = ([Ink] = Stift [Weichpapier] = 'Übungsbuch' [Hardpapier] = "Lehrbuch" [Kunststoff] = Lineal [Spezialpapier] = 42 [Holz] = Bleistift)
echo $ arr [Ink]
echo $ arr [Soft Paper]
echo $ arr [Hard Paper]
echo $ arr [plastil]
echo $ arr [Special Paper]
echo $ arr [Wood]

Die Ausgabe ist:

Stift
Übungsheft
Lehrbuch
Herrscher
42
Bleistift

Anzeige aller Werte im assoziativen Array

Um alle Werte anzuzeigen, kann $ name [*] oder $ name [@] verwendet werden. In diesen Ausdrücken, * oder @ befindet sich an der Stelle des Schlüssels. Und damit werden die Werte der im Array vorhandenen Elemente der Elemente zurückgegeben, anstatt die Werte der Elemente zurückzugeben. Der folgende Code zeigt dies:

Declare -a arr
arr [weiches Papier] = 'Übungsbuch' arr [Plastik] = Lineal arr [Holz] = Bleistift
echo $ arr [@]
echo $ arr [*]

Die Ausgabe ist,

Bleistift -Übungsbuch Herrscher
Bleistift -Übungsbuch Herrscher

Die Reihenfolge der Werte am Ausgang muss der Reihenfolge im assoziativen Array nicht entsprechen. Beachten Sie, dass @ und * auf diese Weise verwendete Synonyme sind. Es gibt ein Problem mit der Ausgabe: Die Phrasen sind durch Leerzeichen getrennt und können nicht unterschieden werden. Der folgende Code trennt die Phrasen mit Kommas:

Declare -a arr
arr [weiches Papier] = 'Übungsbuch' arr [Plastik] = Lineal arr [Holz] = Bleistift
Ifs =,
echo "$ arr [@]"
echo "$ arr [*]"

Die Ausgabe ist jetzt:

Bleistift -Übungsbuch Herrscher
Bleistift, Übungsbuch, Herrscher

IFS bedeutet internes Feldabscheider. Es wurde ein Komma zugewiesen. Beachten Sie die Verwendung von Doppelzitaten für $ arr [@] und $ arr [*] in den Echo -Befehlen. Kommas wurden für das * ein?. Es gibt noch ein weiteres Problem: In der zweiten Ausgabelinie, in der Kommas eingesetzt wurden, wurden keine Räume angezeigt. Also, @ und * sind nicht die ganze Zeit Synonyme. Nun, es ist möglich, sich mit Komma und Raum zu trennen - siehe unten.

Anzeige aller Schlüssel des assoziativen Arrays

Der Ausdruck $ !Name [@] oder $ !Name [*] Gibt die Schlüssel eines Arrays als Liste zurück, die durch Leerzeichen getrennt sind. Beachten Sie die Verwendung und Position des Ausrufezeichens (Ausrufezeichen (!). Der folgende Code zeigt die Verwendung dieser Ausdrücke:

Declare -a arr
arr [weiches Papier] = 'Übungsbuch' arr [Plastik] = Lineal arr [Holz] = Bleistift
echo $ !arr [@]
echo $ !arr [*]

Die Ausgabe ist:

Holzweichpapier Plastik
Holzweichpapier Plastik

Die Reihenfolge der Schlüssel des assoziativen Arrays muss nicht mit dem im Array deklarierten Deklary sein.

Anzahl der Elemente von assoziativem Array

Der Ausdruck gibt die Anzahl der Elemente an, die in einem assoziativen Array festgelegt sind, $ #arr [@] oder $ #arr [*], wie im folgenden Code gezeigt:

Declare -a arr
arr [weiches Papier] = 'Übungsbuch' arr [Plastik] = Lineal arr [Holz] = Bleistift
echo $ #arr [@]
echo $ #arr [*]

Die Ausgabe ist:

3
3

Beachten Sie die Verwendung und Position des Symbols, #.

Anzeige nur assoziativer Array -Set -Elemente

Ein Schlüsselelement hat ein Wert zugewiesen, während das nicht zugewiesene Wert nicht festgelegt ist. Der folgende Code zeigt nur die festgelegten Werte an:

Declare -a arr
arr [Tinte] = Stift
$ arr [Soft Paper]; arr [Soft Paper] = 'Übungsbuch' '
$ arr [Hard Paper]
arr [Plastik] = Lineal
$ arr [Special Paper]
arr [Holz] = Bleistift
für Schlüssel in "$ !arr [@] "; tun
printf "$ arr [$ key]", "
Erledigt
Echo

Die Ausgabe ist:

Bleistift, Übungsbuch, Stift, Herrscher,

Auch hier befindet sich die Ausgangspositionierung nicht in der Reihenfolge, die codiert wurde. Beachten Sie, dass „$ !arr [@] ”ist in doppelten Zitaten, so dass Werte, die Leerzeichen enthalten, gedruckt werden können. Beachten Sie, dass in $ arr [$ key] der Schlüssel $ vorausgeht. Der Befehl printf ähnelt dem Befehl echo, fügt jedoch nach der Anzeige keine neue Zeile hinzu. Es war möglich, die Werte am Ausgang mit einem Komma und Raum in einer Zeile zu trennen. Das letzte Echo würde dazu führen, dass die nächste Ausgabe in die nächste Zeile geht.

Einstellung und verunreinigter assoziativer Array -Elemente und dessen Array

Jedes Schlüsselelement, dem kein Wert zugewiesen wurde. Ein Schlüsselelement, dessen Wert zugewiesen wird, ist festgelegt. Jetzt kann ein Element absichtlich nicht festgelegt sein, wie das folgende Skript zeigt:

Declare -a arr
arr [weiches Papier] = 'Übungsbuch' arr [Plastik] = Lineal arr [Holz] = Bleistift
Uneingestellter arr [Plastik]
für Schlüssel in "$ !arr [@] "; tun
printf "$ arr [$ key]", "
Erledigt
Echo

Die Ausgabe ist:

Bleistift, Übungsbuch,

"Herrscher" wurde nicht angezeigt. Die Syntax, um ein Element abzubauen, lautet:

Nicht fester ArrayName [Schlüssel]

Die Syntax zum Entfernen oder Verunreinigen des gesamten assoziativen Arrays lautet:

Nicht fester ArrayName

oder

Nicht fester ArrayName [@]

oder

Nicht fester ArrayName [*]

Im folgenden Code ist das gesamte Array nicht festgelegt:

Declare -a arr = ([Ink] = Stift [Weichpapier] = 'Übungsbuch' [Hardpapier] = "Textbuch" [Kunststoff] = Lineal [Spezialpapier] = 42 [Holz] = Bleistift)
Uneingestellter arr
echo "$ arr [*]"

Die Ausgabe ist nichts (eine leere Linie), weil das gesamte Array ungestürzt wurde.

Anzeige der Werte eines zugehörigen Arrays

Anzeige der Werte eines zugehörigen Arrays

Declare -a arr = ([Ink] = Stift [Weichpapier] = 'Übungsbuch' [Hardpapier] = "Textbuch" [Kunststoff] = Lineal [Spezialpapier] = 42 [Holz] = Bleistift)
für Wert in "$ arr [@]"; Tun
echo $ value
Erledigt

Die Ausgabe ist:

Bleistift
42
Übungsheft
Lehrbuch
Stift
Herrscher

Auch hier muss die Reihenfolge, in der die Werte in einem assoziativen Array codiert werden, nicht die Reihenfolge sein, in der sie angezeigt werden. Beachten Sie, dass @ für die Listenvariable anstelle von * verwendet wurde. Außerdem wurden Doppelzitate für die Listenvariable verwendet.

Abschluss

Ein Array ist eine Liste, entweder nummeriert oder geküsst. Wenn das Array nummeriert ist, handelt es sich um ein indiziertes Array. Wenn sich die Werte nach Schlüssel befinden, handelt es sich um ein assoziatives Array. Mit dem indizierten Array beginnt die Nummerierung von Null. Beim Computer muss das Array codiert werden. Der Programmierer muss wissen, wie man das Array erstellt. Er muss wissen, wie man dem Array Elemente hinzufügt und Elemente aus dem Array löscht. Er muss in der Lage sein, die Anzahl der Elemente im Array zu bestimmen. Und er muss wissen, wie man das Array löscht.