come contare la lunghezza di un array definito in bash?


58

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 "attuale" e "totale", poiché l'output atteso di questo è:

1/3
2/3
3/3

Grazie per qualsiasi tipo di consiglio


Si noti che è necessario inserire ${array[@]}virgolette doppie. Altrimenti, verrà eseguita la suddivisione in parole e otterrai risultati indesiderati, su input come array=("item 1" "item 2" "item 3").
gardenhead

Risposte:


102

È possibile accedere agli indici dell'array utilizzando ${!array[@]}e la lunghezza dell'array utilizzando ${#array[@]}, ad 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 , otterrai effettivamente:

0/3
1/3
2/3

Se si desidera che il conteggio venga eseguito da 1, è possibile sostituirlo $indexcon $((index+1)). Se vuoi i valori e gli indici puoi usare "${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

Se voglio ottenere 1,2,3, posso fare questo echo ($index+1)/${#array[@]}:?
AGamePlayer

btw, sembra che in questo modo non riesco a ottenere item1, item2, item3 nel loop. Ho ancora altro codice per gestire le cose item1, item2, item3. Grazie,
AGamePlayer

Vedi post modificato.
Steeldriver,

1

Un indice zero è perfettamente valido se si considera l'indice come effettivamente un offset dall'indirizzo base di un array. Questa è la norma in realtà, anche se varia da dialetto a dialetto. Con il vecchio linguaggio Jovial, in [0]realtà conteneva la dimensione massima dell'array. così è iniziato con [1].

Con alcune implementazioni di base, puoi scegliere arbitrariamente di avere uno 0o 1come primo indice. E almeno uno di base permette di designare gli array all'indice fron [n]a [m]. dove ne mpuò avere qualsiasi valore intero, anche negativo, purché nsia minore o uguale a m. Il valore nloro viene sottratto [index]dall'immissione, come index-n = 0se l'indice corrispondesse n.

Ma puoi fare la stessa cosa e altro nel tuo codice. È anche possibile invertire l'ordine 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 parzialmente di una lingua. Volevo solo che fosse più leggibile. La variabile step viene utilizzata per controllare la direzione apparente in cui ci si sta spostando, sia positiva che negativa, e viene utilizzata per calcolare l'indice effettivo quando si entra o esce dall'array, che in realtà è sempre positivo [0].

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.