Wie zählt man die Länge eines in Bash definierten Arrays?

Ich bin neu in Bash 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 Wert current und total als erwartete Ausgabe davon berechnen:

1/3 2/3 3/3 

Vielen Dank für alle Arten von Tipps.

Kommentare

  • Beachten Sie, dass Sie setzen sollten ${array[@]} in doppelten Anführungszeichen. Andernfalls wird eine Wortaufteilung durchgeführt und Sie erhalten unerwünschte Ergebnisse bei Eingaben wie array=("item 1" "item 2" "item 3").

Antwort

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

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

Da Bash-Arrays null indiziert sind, erhalten Sie tatsächlich:

0/3 1/3 2/3 

Wenn die Zählung von 1 ausgehen soll, können Sie $index durch $((index+1)) ersetzen. Wenn Sie die -Werte sowie die Indizes möchten, können Sie "${array[index]}" verwenden, dh

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

1/3 = item1 2/3 = item2 3/3 = item3 

Kommentare geben

  • Wenn ich 1,2,3 erhalten möchte, kann Ich mache das: echo ($index+1)/${#array[@]}?
  • Übrigens scheint es, dass ich auf diese Weise ' nicht item1 bekommen kann, item2, item3 in der Schleife. Ich habe noch anderen Code, um mit den Sachen item1, item2, item3 umzugehen. Vielen Dank,
  • Siehe bearbeiteten Beitrag.

Antwort

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

Bei einigen Basisimplementierungen können Sie beliebig wählen, entweder 0 oder 1 als erster Index. Mit mindestens einem Basic können Sie Arrays festlegen, die von [n] bis [m] indiziert werden sollen. Dabei n und m können einen beliebigen ganzzahligen Wert haben, auch einen negativen, solange n kleiner ist als oder gleich m. Der Wert n wird von der eingegebenen [index] subtrahiert. als index-n = 0, wenn der Index n entspricht.

Sie können jedoch dasselbe und mehr in Ihrem eigenen Code tun Sie können die Reihenfolge sogar umkehren eines Arrays auf diese Weise:

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, ob positiv oder negativ, und wird verwendet, um den effektiven Index beim Betreten oder Verlassen des Arrays zu berechnen, der tatsächlich immer positiv von .

Schreibe einen Kommentar

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