Sunt „nou” și nu pot găsi un tutorial bun pentru a răspunde la întrebarea mea.
array=( item1 item2 item3 ) for name in ${array[@]}; do echo current/total ... some other codes done
Vreau să calculez valoarea current și total, ca ieșire așteptată fiind:
1/3 2/3 3/3
Vă mulțumim pentru orice fel de sfaturi.
Comentarii
Răspuns
Puteți accesa indicii matricei utilizând ${!array[@]} și lungimea matricei utilizând ${#array[@]} , de exemplu :
#!/bin/bash array=( item1 item2 item3 ) for index in ${!array[@]}; do echo $index/${#array[@]} done
Rețineți că, din moment ce matricile bash sunt indexate zero , veți obține de fapt:
0/3 1/3 2/3
Dacă doriți ca numărul să ruleze de la 1 puteți înlocui $index cu $((index+1)). Dacă doriți valorile , precum și indicii, puteți utiliza "${array[index]}" ie
#!/bin/bash array=( item1 item2 item3 ) for index in ${!array[@]}; do echo $((index+1))/${#array[@]} = "${array[index]}" done
oferind
1/3 = item1 2/3 = item2 3/3 = item3
Comentarii
- Dacă vreau să obțin 1,2,3, pot Fac asta:
echo ($index+1)/${#array[@]}? - între altele, se pare că în acest fel nu pot ' să obțin item1, item2, item3 în buclă. Încă mai am un alt cod care să se ocupe de elementele item1, item2, item3. Mulțumesc,
- Vedeți postarea editată.
Răspuns
Un index zero este perfect valid dacă credeți că indexul este de fapt un offset de la adresa de bază a unui tablou. Aceasta este de fapt norma, deși variază de la dialect la dialect. Cu vechea limbă jovială, [0] conținea de fapt dimensiunea maximă a matricei. Așa că a început cu [1].
Cu unele implementări de bază, puteți alege în mod arbitrar să aveți fie 0, fie 1 ca primul index. Și cel puțin un element de bază vă permite să desemnați tablouri pentru a indexa din [n] la [m]. unde n și m pot avea orice valoare întreagă, chiar negativă, atâta timp cât n este mai mic decât sau egal cu m. Valoarea n le este scăzută din [index] introdus, ca index-n = 0 dacă indexul corespunde n.
Dar puteți face același lucru și multe altele în propriul cod Puteți chiar inversa ordinea dintr-o matrice în acest fel:
dim array(0, abs(m-n)); step=sign(m-n); if n > m then base=m else base=n; fi
Acest exemplu de cod este de fapt doar parțial dintr-o singură limbă. Voiam doar să fie mai ușor de citit. Variabila pas este utilizată pentru a controla direcția aparentă în care vă deplasați, fie că este pozitivă sau negativă, și este utilizată pentru a calcula indicele efectiv atunci când intrați sau ieșiți din matrice, care este de fapt întotdeauna pozitiv din [0].
${array[@]}între ghilimele duble. În caz contrar, se va efectua împărțirea cuvintelor și veți obține rezultate nedorite, pe intrări precumarray=("item 1" "item 2" "item 3").