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
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]
.
${array[@]}
tussen dubbele aanhalingstekens. Anders wordt woordsplitsing uitgevoerd en krijgt u ongewenste resultaten, op invoer zoalsarray=("item 1" "item 2" "item 3")
.