як порахувати довжину масиву, визначеного в bash?


58

Я новачок в баші і не можу знайти хороший підручник, щоб відповісти на моє запитання.

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

Я хочу обчислити значення "поточне" та "загальне", оскільки очікуваний вихід цього:

1/3
2/3
3/3

Дякую за будь-які поради


Зауважте, що вам слід поставити ${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

Якщо я хочу отримати 1,2,3, чи можу я це зробити echo ($index+1)/${#array[@]}:?
AGamePlayer

btw, здається, що таким чином я не можу отримати item1, item2, item3 у циклі. У мене ще є інший код для вирішення предметів1, item2, item3. Дякую,
AGamePlayer

Дивіться відредаговану публікацію.
steeldriver

1

Нульовий індекс цілком справедливий, якщо ви вважаєте, що індекс фактично є зсувом від базової адреси масиву. Це насправді норма, хоча вона варіюється від діалектної до діалектної. Зі старою мовою Jovial [0]фактично містився максимальний розмір масиву. так це почалося з [1].

З деякими основними реалізаціями ви можете довільно обрати, щоб вони були 0або 1як перший індекс. І принаймні один Basic дозволяє призначити масиви для індексу fron [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

Цей приклад коду насправді лише частково з однієї мови. Я просто хотів, щоб це було більш читабельним. Етап змінна використовується для управління видимим напрямком, в якому ви рухаєтесь, чи то позитивний чи негативний, так і використовується для обчислення ефективного індексу при вході або виходженні з масиву, який насправді завжди є позитивним [0].

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.