2014-02-14 90 views
0

我嘗試創建一個填充了某些值的數組。但我不知道該怎麼做。我嘗試了下面的東西,但沒有奏效。Bash腳本:在for循環中填充數組

我的代碼:

i=0 
for c in colors; do 
array[$i]=$c 
echo {$c[$i]} 
i=`expr $i + 1` 
done 

注: 「顏色」 是某種形式的 「PS -ef」 命令,它返回值的列表。例如它有「藍色,紅色,黃色」值。

colors= 'ps -ef | grep colors' 
+0

準確*返回'colors'列表很重要。如果他們一對一返回,那麼有更可靠的方法可以將它們分解出來(比如你正在做什麼,以及你接受的答案是做什麼的,哪些將會改變),比如,當前目錄中的文件列表的顏色'*',或者兩個條目'light'和'洋紅色'的顏色'light magenta')。 –

+0

順便說一句,在bash中,'((++ i))'是寫'i = $(expr $ i + 1)'的現代方式。 –

+0

...並且唯一與您的代碼完全無關的東西(與最佳做法違規相對)正在編寫'{$ c [$ i]}'而不是'$ {c [$ i]}'和'in colors '而不是'在$顏色'中。 –

回答

2

你可以使用這個腳本,以填補在一個循環數組:

array=() 
for c in $colors; do 
    array+=("$c") 
done 

或者也可以簡單:

array=($(command)) 
+0

如果我們假設字符串分裂是給定的,那麼是的。如果輸入是一對一的,最佳實踐方法是使用while/read循環來分割元素 - 這樣我們就不會有glob擴展,基於IFS的分割,或者其他這樣的副作用。 –

+0

有沒有關於你的「簡單」命令的例子?它是否像「array =($(」ps -ef | grep pmon「))」? – AloneInTheDark

+2

@AloneInTheDark,沒有引號;只是'array =($(ps -ef | grep ...))' - 但由於幾個原因,這是一個不好的做法。 –

2

如果你的顏色在一到一個未來在你展開存儲它們的變量時,你可能會丟失信息(刪除空格和換行符之間的區別,擴展glob字符等)。

不要這樣做。相反,遵循BashFAQ #1

colors=() 
while IFS='' read -r color; do 
    colors+=("$color") 
done < <(get-color-list) 

如果你只是想,說這是更真實,具體的列了各行的; read將爲您進行分欄,使分配更容易。