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.