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


57

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

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")
gardenhead

Answers:


100

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

顺便说一句,似乎这种方式我无法在循环中获得item1,item2,item3。我还有其他代码来处理item1,item2,item3。谢谢,
AGamePlayer 2015年

参见编辑后的帖子。
钢铁司机

1

如果您认为索引实际上是相对于数组基地址的偏移量,则零索引是完全有效的。尽管这在方言之间有所不同,但实际上这是规范。使用旧的Jovial语言,[0]实际上包含了数组的最大大小。所以它开始于[1]

使用某些基本实现,您可以任意选择将01作为第一个索引。并且至少有一个Basic允许您指定数组以索引从[n][m]。只要小于或等于,则nm可以具有任何整数值,甚至可以是负数。它们的值将从输入的值中减去,就好像索引对应于。nmn[index]index-n = 0n

但是您可以在自己的代码中做同样的事情,甚至做更多。您甚至可以通过以下方式反转数组的顺序:

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

此代码示例实际上仅是一种语言的一部分。我只是想让它更具可读性。step变量用于控制正向或负向移动的视在方向,并用于计算进入或离开数组时的有效索引,实际上从总是为正[0]

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.