如何计算bash中定义的数组的长度?

如何计算bash中定义的数组的长度?

我是 Bash 新手,找不到好的教程来回答我的问题。

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

我想计算currenttotal值,作为其预期输出:

1/3
2/3
3/3

感谢您提供任何提示。

答案1

您可以使用 访问数组索引${!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

答案2

如果您认为索引实际上是一个索引,则零索引是完全有效的抵消从数组的基地址开始。事实上,这是常态,尽管不同方言有所不同。使用旧的 Jovial 语言,[0]实际上包含了数组的最大大小。所以它开始于[1].

对于某些基本实现,您可以任意选择使用01作为第一个索引。并且至少有一个 Basic 允许您指定从[n]到 的索引数组[m]。其中nm可以是任何整数值,甚至是负数,只要n小于或等于mn从输入的值中减去它们的值[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]

相关内容