jak policzyć długość tablicy zdefiniowanej w bash?

58

Jestem nowy w bash i nie mogę znaleźć dobrego samouczka, aby odpowiedzieć na moje pytanie.

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

Chcę obliczyć wartość „bieżącą” i „całkowitą”, ponieważ oczekiwany wynik tego:

1/3
2/3
3/3

Dzięki za wszelkie wskazówki

AGamePlayer
źródło
Pamiętaj, że powinieneś wstawić ${array[@]}podwójne cudzysłowy. W przeciwnym razie zostanie wykonane dzielenie słów, a przy takich wejściach otrzymasz niepożądane rezultaty array=("item 1" "item 2" "item 3").
ogrodnik

Odpowiedzi:

102

Możesz uzyskać dostęp do wskaźników tablicy za pomocą ${!array[@]}i długości tablicy za pomocą ${#array[@]}, np .:

#!/bin/bash

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

Zauważ, że ponieważ tablice bash są indeksowane na zero , faktycznie otrzymasz:

0/3
1/3
2/3

Jeśli chcesz, aby uruchomić liczenie od 1 można zastąpić $indexprzez $((index+1)). Jeśli chcesz wartości, a także indeksów, których możesz użyć, "${array[index]}"tj

#!/bin/bash

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

dający

1/3 = item1
2/3 = item2
3/3 = item3
steeldriver
źródło
Jeśli chcę dostać 1,2,3, czy mogę to zrobić echo ($index+1)/${#array[@]}:?
AGamePlayer
btw wydaje się, że w ten sposób nie mogę dostać item1, item2, item3 do pętli. Nadal mam inny kod do obsługi rzeczy item1, item2, item3. Dzięki,
AGamePlayer
Zobacz edytowany post.
steeldriver
1

Indeks zerowy jest całkowicie poprawny, jeśli myślisz, że indeks jest faktycznie przesunięciem względem adresu bazowego tablicy. To w rzeczywistości norma, choć różni się w zależności od dialektu. W starym języku Jovial [0]faktycznie zawierał maksymalny rozmiar tablicy. więc zaczęło się od [1].

W przypadku niektórych podstawowych implementacji możesz dowolnie wybrać jeden 0lub 1pierwszy indeks. I co najmniej jeden podstawowy pozwala na wyznaczenie granic tablic do indeksu [n]do [m]. gdzie ni mmoże mieć dowolną wartość całkowitą, nawet ujemną, o ile njest mniejsza lub równa m. Wartość nzostaje odjęta od [index]wprowadzonego, tak index-n = 0jakby indeks odpowiadał n.

Ale możesz zrobić to samo i więcej we własnym kodzie. Możesz nawet odwrócić kolejność tablicy w ten sposób:

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

Ten przykład kodu jest w rzeczywistości tylko częściowo z jednego języka. Chciałem tylko, żeby był bardziej czytelny. Zmienna krokowa służy do kontrolowania pozornego kierunku, w którym się poruszasz, niezależnie od tego, czy jest ona dodatnia czy ujemna, i służy do obliczania efektywnego indeksu przy wchodzeniu do tablicy lub wychodzeniu z niej, z którego faktycznie zawsze jest dodatnia [0].

Donald Darden
źródło