Auflisten aller anderen Array-Elemente in der Schleife


0

Ich habe ein dynamisches Array mit Schlüsselpaarwerten und möchte jeden anderen Wert aufzählen . In diesem Fall nur die Namen im Array. Da ich bash v4 nicht verwende, kann ich seqmit echo durch ein Array navigieren.

$ array=(Guido yes Francesca no Balthazar yes)
for x in $(seq 0 2 ${#array[@]});do echo $x;done
0
2
4
6

Dies gibt ein Element mehr zurück als die Paare, die ich habe (aufgrund des Versatzes von 0), aber ich kann das mit einfacher Bash-Mathematik erklären:

for x in $(seq 0 2 $((${#array[@]}-1)));do echo $x;done
0
2
4

Das funktioniert gut. Aber sobald ich versuche, Elemente herauszuholen $array, erhalte ich einen Fehler, den ich nicht erklären kann. Ich habe es mit und ohne "Mathe" versucht

$ for x in $(seq 0 2 $((${#array[@]}-1)));do echo ${array[$x]};done
-bash: 0: syntax error: operand expected (error token is "0")

$ for x in $(seq 0 2 ${#array[@]});do echo ${array[$x]};done
-bash: 0: syntax error: operand expected (error token is "0")

Wie kann ich aus diesem dynamischen Array nur die Namen abrufen?

BEARBEITEN: Mein $BASH_VERSIONist 3.2.57(1)-release( Mac OS X 10.10.2 )

EDIT # 2: Ich bin zu dem Schluss gekommen, dass dies möglicherweise ein Fehler in dieser Version ist. Da ich eine Reihe von AWS-Instanzen verwalte, habe ich mich entschlossen, sie zu überprüfen, und alle haben Bash 4.1.2 (1). Ich habe meinen Mac auf diese Version aktualisiert und das funktioniert jetzt. Danke, dass Sie nachgesehen haben, aber ich schildere dies als eine Anomalie.


Ich kopierte Ihren Befehl und klebte es in meinem System, und es funktionierte , wie man wollte (es gedruckt ${array[0]}, ${array[2]}, ${array[4]}, ...). Können Sie für den Befehl, den Sie an einen funktionierenden Befehl gesendet haben, rückwärts arbeiten (möglicherweise wird jedes Element mit einer Schleife oder gedruckt set | grep "^array") und diesen Befehl veröffentlichen ?
Scott

Funktioniert gut mit bash 3.2.39 (1) -release. Bitte fügen Sie echo $BASH_VERSIONIhrer Frage die Ausgabe von hinzu .
Cyrus

Leute, da ich auf einem Mac bin, habe ich beschlossen, die von mir verwalteten AWS-Instanzen zu überprüfen. Alle von ihnen haben Bash 4.1.2 (1). Also habe ich meinen Mac auf diese Version aktualisiert und das funktioniert jetzt. Ich vermute, es ist ein Fehler in dieser bestimmten Version, aber ich gehe weiter. Vielen Dank für Ihre Hilfe.
SaxDaddy

Ich schlage vor, dass Sie Ihre Lösung in Ihr Programm übernehmen (Fehler in der alten Version), das Sie Ihrer Frage hinzugefügt und als Kommentar hinzugefügt und als Antwort veröffentlicht haben. Dann nimm es an. (Möglicherweise müssen Sie einige Stunden warten, bevor Sie Ihre eigene Antwort akzeptieren können.) Dadurch wird leichter ersichtlich, dass diese Frage gelöst ist und keiner weiteren Aufmerksamkeit bedarf. Dies ist dem Setzen von "Gelöst:" vorzuziehen. (Außerdem erhalten Sie 2 Reputationspunkte, wenn Sie Ihre eigene Antwort akzeptieren.)
Scott

Antworten:


2

Wenn Sie alternative Elemente des Arrays durchlaufen möchten, sollte dies in Bash 3.2 funktionieren:

while IFS= read -d '' -r name; do
  # do something with "$name"
done < <(printf %s%.0s\\0 "${array[@]}")

Sie könnten ähnliche Dinge tun, xargs -0wenn das bequemer wäre.

Wenn keiner Ihrer Namen einen Doppelpunkt enthält (zum Beispiel), können Sie die Namen in ein neues Array wie folgt extrahieren:

IFS=: read -a names -r < <(printf %s%.0s: "${array[@]}")

(Leider können Sie das Feldtrennzeichen nicht auf NUL setzen.)

All dies hängt von der Tatsache ab, dass die printfFormatzeichenfolge so oft wiederholt wird, wie es für die Verwendung aller Argumente erforderlich ist (Posix-Verhalten, sollte also auf jeder Bash-Version oder mit der nicht eingebauten Version funktionieren printf). Das gelegentlich nützliche Format %.0sverwendet ein Argument und gibt höchstens 0 Zeichen aus, das heißt, es wird in den Bitbucket abgelegt.


(Ich verstehe nicht, warum Ihre for-Schleife auch nicht funktioniert, aber ich habe keine Bash 3, mit der ich sie testen kann. Es muss etwas seltsam bei der Auswertung des Array-Index sein. Ist der Fehler in der OP-Kopie und direkt von der Konsole
eingefügt

Ich weiß es auch nicht, aber da ich auf einem Mac bin und AWS-Systeme verwalte, habe ich es überprüft und alle haben Bash 4.1.2 (1). Ich habe mit Homebrew meinen Mac auf diese Version aktualisiert und das funktioniert jetzt. Ich vermute, es ist ein Fehler in dieser bestimmten Version, aber ich gehe weiter. Danke für Ihre Hilfe.
SaxDaddy
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.