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

Podczas pracy nad scenariuszem uzyskać następujące dane wyjściowe debugowania:Zmienna jako indeks tablicy 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 

Dlaczego zmienna $ array_counter nie rozszerzać, gdy używany jako indeks w tablicy []?

+0

Co prawda robi, że można się spodziewać? Po twojej pętli tablica jest "1 1 1" –

+0

Spodziewam się, że wynik debugowania będzie pokazywał tablicę [0] = 1, tablica [1] = 1 i tak dalej. –

+0

ah, martwisz się tylko wyjściem debugowania. Naprawdę jestem zaskoczony, że działa bez "ewaluacji", ale możliwe, że tablice LHS są inaczej rozwijane. –

Odpowiedz

19

Bash wydaje się całkowicie zadowolony ze zmiennych jako indeksów tablicy:

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

... a ponieważ indeksy tablicowe są obliczane w kontekście arytmetycznym, nie potrzebujesz nawet '$', możesz nawet robić rzeczy takie jak '$ {array [arrayindex-1]}', które poprawnie odnoszą się do 'b'. –

-1

Twój przykład faktycznie działa.

echo ${array[@]} 

potwierdza to.

Można spróbować bardziej efektywny sposób zwiększając swój indeks:

((array_counter++))