Как посчитать длину массива, определенного в Bash?

58

Я новичок в Bash и не могу найти хороший учебник, чтобы ответить на мой вопрос.

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

Я хочу вычислить «текущее» и «общее» значение как ожидаемый результат:

1/3
2/3
3/3

Спасибо за любые советы

AGamePlayer
источник
Обратите внимание, что вы должны поставить ${array[@]}в двойные кавычки. В противном случае будет выполнено разделение слов, и вы получите нежелательные результаты, например, при вводе array=("item 1" "item 2" "item 3").
садовод

Ответы:

102

Вы можете получить доступ к индексам массива, используя ${!array[@]}и длину массива ${#array[@]}, например:

#!/bin/bash

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

Обратите внимание, что поскольку массивы bash проиндексированы нулями , вы получите:

0/3
1/3
2/3

Если вы хотите, чтобы счетчик работал с 1, вы можете заменить $indexна $((index+1)). Если вы хотите значения, а также индексы, которые вы можете использовать, "${array[index]}"т.е.

#!/bin/bash

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

дающий

1/3 = item1
2/3 = item2
3/3 = item3
steeldriver
источник
Если я хочу получить 1,2,3, могу ли я сделать это echo ($index+1)/${#array[@]}:?
AGamePlayer
Кстати, похоже, что таким образом я не могу получить item1, item2, item3 в цикле. У меня еще есть другой код для работы с деталями item1, item2, item3. Спасибо,
AGamePlayer
Смотрите отредактированный пост.
стальная водитель
1

Нулевой индекс вполне допустим, если вы думаете, что индекс фактически является смещением от базового адреса массива. На самом деле это норма, хотя она варьируется от диалекта к диалекту. Со старым языком Jovial [0]фактически содержался максимальный размер массива. так началось с [1].

В некоторых базовых реализациях вы можете произвольно выбрать один 0или 1первый индекс. И по крайней мере один Basic позволяет назначить массивы индекса Фрон [n]к [m]. где nи mможет иметь любое целочисленное значение, даже отрицательное, если nоно меньше или равно m. Значение nих становится вычитаемым из [index]введенного, как index-n = 0будто индекс соответствует n.

Но вы можете сделать то же самое и многое другое в своем собственном коде. Вы можете даже изменить порядок массива следующим образом:

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

Этот пример кода на самом деле только частично из одного языка. Я просто хотел, чтобы это было более читабельным. Переменная step используется для управления видимым направлением движения в положительном или отрицательном направлении и используется для расчета эффективного индекса при входе или выходе из массива, который фактически всегда является положительным [0].

Дональд Дарден
источник