hoe tel je de lengte van een array gedefinieerd in bash?

Ik “ben nieuw bij bash en kan” geen goede tutorial vinden om mijn vraag te beantwoorden.

array=( item1 item2 item3 ) for name in ${array[@]}; do echo current/total ... some other codes done 

Ik wil de current en total waarde berekenen, als de verwachte output hiervan:

1/3 2/3 3/3 

Bedankt voor alle tips.

Opmerkingen

  • Merk op dat je ${array[@]} tussen dubbele aanhalingstekens. Anders wordt woordsplitsing uitgevoerd en krijgt u ongewenste resultaten, op invoer zoals array=("item 1" "item 2" "item 3").

Antwoord

Je hebt toegang tot de array-indices met ${!array[@]} en de lengte van de array met ${#array[@]} , bijv :

#!/bin/bash array=( item1 item2 item3 ) for index in ${!array[@]}; do echo $index/${#array[@]} done 

Merk op dat aangezien bash-arrays nul-geïndexeerd zijn, u in feite het volgende krijgt:

0/3 1/3 2/3 

Als u wilt dat de telling begint vanaf 1, kunt u $index vervangen door $((index+1)). Als je zowel de waarden als de indices wilt, gebruik dan "${array[index]}" ie

#!/bin/bash array=( item1 item2 item3 ) for index in ${!array[@]}; do echo $((index+1))/${#array[@]} = "${array[index]}" done 

giving

1/3 = item1 2/3 = item2 3/3 = item3 

Comments

  • Als ik 1,2,3 wil krijgen, kan Ik doe dit: echo ($index+1)/${#array[@]}?
  • trouwens, het lijkt erop dat ik op deze manier ' item1 niet kan krijgen, item2, item3 in de lus. Ik heb nog een andere code voor de items item1, item2, item3-dingen. Bedankt,
  • Zie bewerkte post.

Antwoord

Een nulindex is volkomen geldig als je denkt dat de index feitelijk een offset is vanaf het basisadres van een array. Dat is in feite de norm, hoewel het varieert van dialect tot dialect. Met de oude Jovial-taal bevat [0] feitelijk de maximale grootte van de array. Dus het begon met [1].

Bij sommige basisimplementaties kunt u er willekeurig voor kiezen om 0 of 1 als de eerste index. En met ten minste één Basic kunt u arrays aanwijzen om fron [n] te indexeren naar [m]. waarbij n en m kunnen elk geheel getal hebben, zelfs negatief, zolang n kleiner is dan of gelijk aan m. De waarde n ze worden afgetrokken van de [index] die is ingevoerd, als index-n = 0 als index overeenkomt met n.

Maar je kunt hetzelfde en meer doen in je eigen code U kunt de volgorde zelfs omkeren van een array op deze manier:

dim array(0, abs(m-n)); step=sign(m-n); if n > m then base=m else base=n; fi 

Dit codevoorbeeld is eigenlijk maar gedeeltelijk van één taal. Ik wilde gewoon dat het beter leesbaar zou zijn. De stapvariabele wordt gebruikt om de schijnbare richting waarin u beweegt te bepalen, zowel positief als negatief, en wordt gebruikt om de effectieve index te berekenen wanneer u de array binnengaat of verlaat, die eigenlijk altijd positief is vanaf [0].

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *