我是 Bash 新手,找不到好的教程来回答我的问题。
array=( item1 item2 item3 )
for name in ${array[@]}; do
echo current/total
... some other codes
done
我想计算current
和total
值,作为其预期输出:
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]
.
对于某些基本实现,您可以任意选择使用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
该代码示例实际上只是一种语言的一部分。我只是想让它更具可读性。步骤变量用于控制移动的明显方向,无论是正还是负,并用于计算进入或离开数组时的有效索引,实际上始终为正[0]
。