jak počítat délku pole definovaného v bash?

Jsem nováčkem v bash a nemohu najít dobrý návod, jak odpovědět na mou otázku.

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

Chci vypočítat hodnotu current a total jako očekávaný výstup této hodnoty:

1/3 2/3 3/3 

Děkujeme za jakékoli tipy.

Komentáře

  • Měli byste si dát ${array[@]} v uvozovkách. Jinak bude provedeno rozdělení slov a na vstupech, jako je array=("item 1" "item 2" "item 3"), získáte nežádoucí výsledky.

Odpovědět

K indexům pole můžete přistupovat pomocí ${!array[@]} a délce pole pomocí ${#array[@]} např :

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

Všimněte si, že protože pole bash jsou indexována na nulu , ve skutečnosti získáte:

0/3 1/3 2/3 

Pokud chcete, aby počet běžel od 1, můžete $index nahradit $((index+1)). Pokud chcete hodnoty i indexy, můžete použít "${array[index]}" tj.

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

dávat

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

Komentáře

  • Pokud chci získat 1,2,3, mohu Dělám to: echo ($index+1)/${#array[@]}?
  • btw, zdá se, že tímto způsobem ' nemůžu získat item1, item2, item3 ve smyčce. Stále mám další kód pro řešení položek item1, item2, item3. Děkujeme,
  • viz upravený příspěvek.

odpověď

nulový index je naprosto platný pokud si myslíte, že index je ve skutečnosti offset od základní adresy pole. To je ve skutečnosti norma, i když se liší od dialektu k dialektu. Se starým jazykem Jovial obsahoval [0] maximální velikost pole. Začalo to tedy [1].

U některých základních implementací můžete libovolně zvolit 0 nebo 1 jako první index. A alespoň jeden Basic vám umožňuje určit pole pro indexování fron [n] do [m]. kde n a m mohou mít jakoukoli celočíselnou hodnotu, i zápornou, pokud n je menší menší nebo roven m. Hodnota n je odečtena od zadaného [index], jako index-n = 0 pokud index odpovídá n.

Ale ve svém vlastním kódu můžete dělat totéž a ještě více Můžete dokonce obrátit pořadí pole takto:

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

Tento příklad kódu je ve skutečnosti pouze částečně z jednoho jazyka. Jen jsem chtěl, aby to bylo čitelnější. Kroková proměnná se používá k řízení zdánlivého směru, ve kterém se pohybujete, ať už kladném nebo záporném, a používá se k výpočtu efektivního indexu při vstupu do pole nebo z něj, který je ve skutečnosti vždy kladný od [0].

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *