Wie kann man die Länge eines in bash definierten Arrays zählen?

58

Ich bin neu im Bashing und kann kein gutes Tutorial finden, um meine Frage zu beantworten.

array=( item1 item2 item3)
for name in ${array[@]}; do
    echo current/total
    ... some other codes
done

Ich möchte den "aktuellen" und "Gesamt" -Wert berechnen, da die erwartete Ausgabe davon ist:

1/3
2/3
3/3

Danke für jegliche Art von Tipps

AGamePlayer
quelle
Beachten Sie, dass Sie ${array[@]}doppelte Anführungszeichen setzen sollten . Andernfalls wird die Wortteilung ausgeführt und Sie erhalten unerwünschte Ergebnisse bei Eingaben wie array=("item 1" "item 2" "item 3").
Gardenhead

Antworten:

102

Sie können auf die Array-Indizes mit ${!array[@]}und auf die Länge des Arrays mit zugreifen ${#array[@]}, z. B .:

#!/bin/bash

array=( item1 item2 item3 )
for index in ${!array[@]}; do
    echo $index/${#array[@]}
done

Beachten Sie, dass Sie, da Bash-Arrays mit Nullen indiziert sind , tatsächlich Folgendes erhalten:

0/3
1/3
2/3

Wenn Sie die Zählung laufen von 1 wollen , können Sie ersetzen $indexdurch $((index+1)). Wenn Sie die wollen Werte sowie die Indizes können Sie verwenden , "${array[index]}"dh

#!/bin/bash

array=( item1 item2 item3 )
for index in ${!array[@]}; do
    echo $((index+1))/${#array[@]} = "${array[index]}"
done

geben

1/3 = item1
2/3 = item2
3/3 = item3
Stahlfahrer
quelle
Wenn ich 1,2,3 bekommen will, kann ich das machen echo ($index+1)/${#array[@]}:?
AGamePlayer
Übrigens scheint es, dass ich auf diese Weise nicht Item1, Item2, Item3 in die Schleife bekommen kann. Ich habe noch anderen Code, um mit den Sachen von item1, item2, item3 umzugehen. Vielen Dank,
AGamePlayer
Siehe bearbeiteten Beitrag.
Steeldriver
1

Ein Nullindex ist vollkommen gültig, wenn Sie sich den Index tatsächlich als einen Versatz von der Basisadresse eines Arrays vorstellen. Das ist in der Tat die Norm, obwohl sie von Dialekt zu Dialekt unterschiedlich ist. Mit der alten Jovial-Sprache [0]enthielt tatsächlich die maximale Größe des Arrays. so fing es an mit [1].

Bei einigen Basisimplementierungen können Sie wahlweise einen 0oder 1den ersten Index festlegen. Mit mindestens einem Basic können Sie Arrays festlegen [n], auf die der Index angewendet werden soll [m]. Dabei kann nund meinen beliebigen ganzzahligen Wert haben, auch einen negativen, solange dieser nkleiner oder gleich ist m. Der Wert, den nsie haben, wird von dem [index]eingegebenen Wert abgezogen , als index-n = 0ob der Index dem entspricht n.

Aber Sie können das Gleiche und mehr in Ihrem eigenen Code tun. Sie können die Reihenfolge eines Arrays sogar folgendermaßen umkehren:

dim array(0, abs(m-n)); 
step=sign(m-n); 
if n > m then 
    base=m 
else 
    base=n; 
fi

Dieses Codebeispiel besteht eigentlich nur teilweise aus einer Sprache. Ich wollte nur, dass es besser lesbar ist. Die Schrittvariable wird verwendet, um die scheinbare Richtung zu steuern, in die Sie sich bewegen, egal ob positiv oder negativ. Sie wird verwendet, um den effektiven Index beim Betreten oder Verlassen des Arrays zu berechnen, der eigentlich immer positiv ist [0].

Donald Darden
quelle