变量作为Bash数组索引?

31
#!/bin/bash

set -x

array_counter=0
array_value=1

array=(0 0 0)

for number in ${array[@]}
do
    array[$array_counter]="$array_value"
    array_counter=$(($array_counter + 1))
done

运行上述脚本时,我得到以下的调试输出:

+ array_counter=0
+ array_value=1
+ array=(0 0 0)
+ for number in '${array[@]}'
+ array[$array_counter]=1
+ array_counter=1
+ for number in '${array[@]}'
+ array[$array_counter]=1
+ array_counter=2
+ for number in '${array[@]}'
+ array[$array_counter]=1
+ array_counter=3
为什么将$array_counter变量用作数组[]的索引时不会展开?

它没有做你期望的事情吗?在循环之后,数组是“1 1 1”。 - evil otto
我期望调试输出显示array[0]=1,array[1]=1等等。 - John Hansen
啊,你只是担心调试输出。实际上,我很惊讶它没有eval也能工作,但可能是因为lhs数组的扩展方式不同。 - evil otto
2个回答

35

Bash似乎可以很好地使用变量作为数组索引:

$ array=(a b c)
$ arrayindex=2
$ echo ${array[$arrayindex]}
c
$ array[$arrayindex]=MONKEY
$ echo ${array[$arrayindex]}
MONKEY

11
由于数组索引在算术上下文中进行评估,因此您甚至不需要$符号,您还可以执行诸如${array[arrayindex-1]}的操作,这有效地引用了b - Adrian Frühwirth

-1

你的例子实际上是有效的。

echo ${array[@]}

确认这一点。

您可以尝试更高效的索引递增方式:

((array_counter++))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接