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

Quando si esegue lo script sopra ottengo il seguente output di debug:Variabile come indice dell'array 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 

Perché la variabile $ array_counter non espandere quando viene utilizzato come indice in array []?

+0

Cosa non fare che ci si aspetta? Dopo il ciclo, array è "1 1 1" –

+0

Mi aspetto che l'output di debug mostri array [0] = 1, array [1] = 1 e così via. –

+0

ah, sei solo preoccupato per l'output di debug. Sono davvero sorpreso che funzioni del tutto senza un 'eval', ma potrebbe essere che gli array di lhs siano espansi in modo diverso. –

risposta

19

Bash sembra perfettamente felice con le variabili, come indici di matrice:

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

... e poiché gli indici di array vengono valutati in un contesto aritmetico non è nemmeno necessario '$', si possono anche fare cose come '$ {array [arrayindex-1]}' che si riferisce validamente a 'b'. –

-1

Il vostro esempio funziona realmente.

echo ${array[@]} 

conferma questo.

Si potrebbe provare modo più efficiente di incrementare l'indice:

((array_counter++)) 
Problemi correlati