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

Jestem nowy w bash i nie mogę znaleźć dobrego samouczka, który mógłby odpowiedzieć na moje pytanie.

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

Chcę obliczyć wartości current i total, jako oczekiwane dane wyjściowe:

1/3 2/3 3/3 

Dziękujemy za wszelkiego rodzaju wskazówki.

Komentarze

  • Pamiętaj, że należy umieścić ${array[@]} w cudzysłowach. W przeciwnym razie zostanie wykonany podział na słowa, a na danych wejściowych, takich jak array=("item 1" "item 2" "item 3"), otrzymasz niepożądane wyniki.

Odpowiedź

Możesz uzyskać dostęp do indeksów tablicy, używając ${!array[@]} i długości tablicy, używając ${#array[@]} , np :

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

Zauważ, że ponieważ tablice basha są indeksowane przez zero , w rzeczywistości otrzymasz:

0/3 1/3 2/3 

Jeśli chcesz, aby liczenie zaczynało się od 1, możesz zamienić $index na $((index+1)). Jeśli potrzebujesz wartości , a także indeksów, 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 

dawanie

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

Komentarze

  • Jeśli chcę otrzymać 1,2,3, mogę Robię to: echo ($index+1)/${#array[@]}?
  • btw, wygląda na to, że w ten sposób mogę ' t uzyskać item1, item2, item3 w pętli. Nadal mam inny kod do obsługi rzeczy item1, item2, item3. Dzięki,
  • Zobacz edytowany post.

Odpowiedź

Indeks zerowy jest całkowicie poprawny jeśli myślisz, że indeks jest w rzeczywistości przesunięciem z adresu podstawowego tablicy. W rzeczywistości jest to norma, chociaż różni się w zależności od dialektu. W starym języku jowialskim [0] faktycznie zawierał maksymalny rozmiar tablicy. Zaczął się więc od [1].

W przypadku niektórych podstawowych implementacji możesz dowolnie wybrać 0 lub 1 jako pierwszy indeks. A co najmniej jeden Basic umożliwia wyznaczenie tablic do indeksowania od [n] do [m]. gdzie n i m mogą mieć dowolną wartość całkowitą, nawet ujemną, o ile n jest mniejsza niż lub równa m. Wartość n zostaje odjęta od wprowadzonej [index], jako index-n = 0, jeśli 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łaściwie tylko częściowo w jednym języku. Chciałem tylko, żeby był bardziej czytelny. Zmienna skokowa jest używana do kontrolowania widocznego kierunku, w którym się poruszasz, dodatniego lub ujemnego, i jest używana do obliczania efektywnego indeksu podczas wchodzenia do tablicy lub wychodzenia z niej, który w rzeczywistości jest zawsze dodatni od [0].

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *