变量作为bash数组索引?
问题描述:
#!/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没有指数[]数组使用时展开?
答
猛砸似乎与变量非常高兴,因为数组索引:
$ 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
答
你的榜样实际工作。
echo ${array[@]}
证实了这一点。
您可以尝试增加你的索引的更有效的方法:
((array_counter++))
什么是它不这样做,你期待什么呢?在循环之后,数组是“1 1 1” – 2012-08-08 00:51:01
我期望调试输出显示数组[0] = 1,数组[1] = 1等等。 – 2012-08-08 00:57:43
啊,你只是担心调试输出。我真的很惊讶它可以在没有'eval'的情况下工作,但它可能是因为lhs数组的扩展不同。 – 2012-08-08 01:12:18