come contare la lunghezza di un array definito in bash?

Sono nuovo a bash e non riesco a trovare un buon tutorial per rispondere alla mia domanda.

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

Voglio calcolare il valore current e total, come output atteso di questo essere:

1/3 2/3 3/3 

Grazie per qualsiasi tipo di suggerimento.

Commenti

  • Tieni presente che dovresti inserire ${array[@]} tra virgolette doppie. In caso contrario, verrà eseguita la suddivisione in parole e si ottengono risultati indesiderati, su input come array=("item 1" "item 2" "item 3").

Risposta

Puoi accedere agli indici dellarray utilizzando ${!array[@]} e la lunghezza dellarray utilizzando ${#array[@]} , per esempio :

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

Nota che poiché gli array bash sono indicizzati a zero , in realtà otterrai:

0/3 1/3 2/3 

Se desideri che il conteggio inizi da 1, puoi sostituire $index con $((index+1)). Se desideri i valori e gli indici puoi utilizzare "${array[index]}" ie

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

dando

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

Commenti

  • Se voglio ottenere 1,2,3, posso Faccio questo: echo ($index+1)/${#array[@]}?
  • btw, sembra che in questo modo non posso ' t ottenere lelemento1, elemento2, elemento3 nel ciclo. Ho ancora altro codice per gestire le cose item1, item2, item3. Grazie,
  • Vedi il post modificato.

Risposta

Un indice zero è perfettamente valido se pensi che lindice sia effettivamente un offset dallindirizzo di base di un array. Questa è la norma, in effetti, anche se varia da dialetto a dialetto. Con la vecchia lingua gioviale, [0] conteneva effettivamente la dimensione massima dellarray. Quindi iniziava con [1].

Con alcune implementazioni di base, puoi scegliere arbitrariamente di avere 0 o 1 come primo indice. E almeno un Basic consente di designare array da indicizzare da [n] a [m]. dove n e m possono avere qualsiasi valore intero, anche negativo, purché n sia inferiore maggiore o uguale a m. Il valore n viene sottratto dal [index] inserito, come index-n = 0 se index corrisponde a n.

Ma puoi fare la stessa cosa e anche di più nel tuo codice Puoi persino invertire lordine di un array in questo modo:

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

Questo esempio di codice è in realtà solo in parte di una lingua. Volevo solo che fosse più leggibile. La variabile step viene utilizzata per controllare la direzione apparente in cui ti stai muovendo, positiva o negativa, e viene utilizzata per calcolare lindice effettivo quando entri o esci dallarray, che in realtà è sempre positivo da [0].

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *