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")
.