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
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]
.
${array[@]}
tra virgolette doppie. In caso contrario, verrà eseguita la suddivisione in parole e si ottengono risultati indesiderati, su input comearray=("item 1" "item 2" "item 3")
.