2014-02-14 53 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将为您进行分栏,使分配更容易。