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

Cuando se ejecuta por encima de la escritura me sale el siguiente resultado de la depuración:Variable como índice de matriz 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 

¿Por qué la variable $ array_counter no ampliar cuando se utiliza como índice en array []?

+0

¿Cómo es no hacer que usted espera? Después de su ciclo, la matriz es "1 1 1" –

+0

Esperaría que la salida de depuración muestre la matriz [0] = 1, la matriz [1] = 1 y así sucesivamente. –

+0

ah, solo te preocupa la salida de depuración. De hecho, me sorprende que funcione sin un 'eval', pero podría ser que las matrices lhs se expandan de forma diferente. –

Respuesta

19

Bash parece perfectamente feliz con variables como los índices de matriz:

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

... y dado que los índices de matriz se evalúan en un contexto aritmético, ni siquiera necesita '$', incluso puede hacer cosas como '$ {matriz [matrizindex-1]}' que se refiere válidamente a 'b'. –

-1

Su ejemplo funciona en realidad.

echo ${array[@]} 

confirma esto.

Usted puede tratar de forma más eficiente de incrementar su índice:

((array_counter++)) 
Cuestiones relacionadas