cum se numără lungimea unui tablou definit în bash?

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

  • Rețineți că ar trebui să puneți ${array[@]} între ghilimele duble. În caz contrar, se va efectua împărțirea cuvintelor și veți obține rezultate nedorite, pe intrări precum array=("item 1" "item 2" "item 3").

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].

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *