Wörterbuch im Shell-Skript zeigt nur das letzte zugeordnete Element an

Ich versuche, Wörterbücher zu verwenden, und bin auf ein seltsames Verhalten gestoßen. Wenn ich ein Wörterbuch wie das folgende erstelle:

 declare -A servers servers=( ["omega"]="dev" ["delta"]="test" ["beta"]="ppd" ["alpha"]="prd" ) echo "${servers["omega"]}"  

Das letzte Element „prd“ wird auf dem Bildschirm gedruckt, nicht auf dem ersten. Das Löschen jedes Eintrags mit Ausnahme des ersten führt zur korrekten Ausgabe. Ich bin mir nicht sicher, was ich falsch mache, da jedes Codebeispiel, das ich mir angesehen habe, Wörterbücher wie oben verwendet. Kann jemand meinen Fehler erkennen?

Grüße

Kommentare

  • Wie führen Sie das Skript aus?
  • Ich führe es von bash aus mit sh binary mit root privs aus.
  • Es verhält sich so, als ob servers ein Array anstelle eines assoziativen Arrays wäre. Suchen Sie nach Tippfehlern und stellen Sie sicher, dass die Bash-Version mindestens 4.0 ist (die erste, die assoziative Arrays unterstützt).
  • Verwenden Sie sh oder bash?
  • Was ist die Version von Bash, den Sie verwenden (es verhält sich so, als ob Sie eine Version von Bash vor 4 verwenden)?

Antwort

Ich denke, @Yurkos Kommentar ist der richtige Track.

Mit Bash vor Version 4 (wie /bin/bash auf einem Mac):

  1. Die Zeile declare -A gibt einen Fehler aus (declare: -A: invalid option) und das Array ist nicht deklariert .
  2. In der zweiten Zeile wird ein indiziertes Array erstellt: da der Index als arithmetischer Ausdruck ausgewertet wird
  3. in bash-arithmetischen Ausdrücken: „bloße“ Wörter werden als Namen von Variablen behandelt, und nicht gesetzte Variablen erhalten den Wert Null.

Daher wird jeder Zeichenfolge zugewiesen Der Index 0.

Versuchen Sie Folgendes:

declare -p servers

und Sie sollten die Ausgabe

 declare -a servers="([0]="prd")"  

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.