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
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].
${array[@]}w cudzysłowach. W przeciwnym razie zostanie wykonany podział na słowa, a na danych wejściowych, takich jakarray=("item 1" "item 2" "item 3"), otrzymasz niepożądane wyniki.