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
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]
.
${array[@]}
v uvozovkách. Jinak bude provedeno rozdělení slov a na vstupech, jako jearray=("item 1" "item 2" "item 3")
, získáte nežádoucí výsledky.