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 seq
mit 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_VERSION
ist 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.
${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 gedrucktset | grep "^array"
) und diesen Befehl veröffentlichen ?echo $BASH_VERSION
Ihrer Frage die Ausgabe von hinzu .Antworten:
Wenn Sie alternative Elemente des Arrays durchlaufen möchten, sollte dies in Bash 3.2 funktionieren:
Sie könnten ähnliche Dinge tun,
xargs -0
wenn 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:
(Leider können Sie das Feldtrennzeichen nicht auf NUL setzen.)
All dies hängt von der Tatsache ab, dass die
printf
Formatzeichenfolge 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 funktionierenprintf
). Das gelegentlich nützliche Format%.0s
verwendet ein Argument und gibt höchstens 0 Zeichen aus, das heißt, es wird in den Bitbucket abgelegt.quelle