2012-08-08 109 views
11
#!/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 

当上面的脚本运行,我得到以下调试输出:变量作为bash数组索引?

+ 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没有指数[]数组使用时展开?

+0

什么是它不这样做,你期待什么呢?在循环之后,数组是“1 1 1” – 2012-08-08 00:51:01

+0

我期望调试输出显示数组[0] = 1,数组[1] = 1等等。 – 2012-08-08 00:57:43

+0

啊,你只是担心调试输出。我真的很惊讶它可以在没有'eval'的情况下工作,但它可能是因为lhs数组的扩展不同。 – 2012-08-08 01:12:18

回答

19

猛砸似乎与变量非常高兴,因为数组索引:

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

...并且由于数组索引在算术上下文中得到评估,所以甚至不需要'$',甚至可以执行像'$ {array [arrayindex-1]}'这样有效地指向'b'的东西。 – 2014-04-01 11:51:01

-1

你的榜样实际工作。

echo ${array[@]} 

证实了这一点。

您可以尝试增加你的索引的更有效的方法:

((array_counter++))