2012-08-08 16 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 

Wenn Skript auszuführen ich die folgende Debug-Ausgabe erhalten:Variable als Bash-Array-Index?

+ 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 

Warum wird die Variable $ array_counter nicht erweitern, wenn sie als Index in Array verwendet []?

+0

Was ist es nicht, dass Sie erwarten, zu tun? Nach Ihrer Schleife, Array ist "1 1 1" –

+0

Ich würde erwarten, dass die Debug-Ausgabe Array [0] = 1, Array [1] = 1 und so weiter. –

+0

ach, du bist nur besorgt über die Debug-Ausgabe. Ich bin eigentlich überrascht, dass es überhaupt ohne 'eval' funktioniert, aber es könnte sein, dass lhs-Arrays unterschiedlich expandiert sind. –

Antwort

19

Bash scheint vollkommen glücklich mit Variablen als Array-Indizes:

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

... und da Array-Indizes in einem arithmetischen Kontext ausgewertet werden, brauchen Sie nicht einmal '$', Sie können sogar Dinge wie '$ {array [arrayindex-1]}' tun, die gültig auf 'b' verweisen. –

-1

Ihr Beispiel funktioniert tatsächlich.

echo ${array[@]} 

bestätigt dies.

Sie könnten effizienter Weg, um Ihren Index des Inkrementierens versuchen:

((array_counter++))