Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Bash脚本:在for循环中填充数组_Linux_Bash - Fatal编程技术网

Linux Bash脚本:在for循环中填充数组

Linux Bash脚本:在for循环中填充数组,linux,bash,Linux,Bash,我尝试创建一个填充了一些值的数组。但我不知道怎么做。我试过下面的东西,但没用 我的代码: i=0 for c in colors; do array[$i]=$c echo {$c[$i]} i=`expr $i + 1` done 注意:“colors”是一种返回值列表的“ps-ef”命令。例如,它有“蓝、红、黄”值 colors= 'ps -ef | grep colors' 可以使用此脚本在循环中填充数组: array=() for c in $colors; do array

我尝试创建一个填充了一些值的数组。但我不知道怎么做。我试过下面的东西,但没用

我的代码:

i=0
for c in colors; do
array[$i]=$c
echo {$c[$i]}
i=`expr $i + 1`
done
注意:“colors”是一种返回值列表的“ps-ef”命令。例如,它有“蓝、红、黄”值

colors= 'ps -ef | grep colors'

可以使用此脚本在循环中填充数组:

array=()
for c in $colors; do
    array+=( "$c" )
done
或者更简单:

array=( $(command) )

如果颜色是一对一的,那么一旦展开存储颜色的变量,就有可能丢失信息(删除空格和换行符之间的区别、展开全局字符等)

不要那样做。相反,请遵循:

colors=()
而IFS=''read-r color;做
颜色+=(“$color”)

完成<如何返回
颜色
列表非常重要。如果它们是一对一返回的,那么有比字符串拆分更可靠的方法将它们取出(这就是你正在做的,也是你被接受的答案所做的,它将改变,例如,一个颜色
*
为当前目录中的文件列表,或者一个颜色
浅品红色
为两个条目,
浅品红色
品红色
)。顺便说一句,在bash中,
(++i))
是编写
i=$(expr$i+1)
的现代方式,而代码中唯一完全不起作用的东西(与违反最佳实践相反)是编写
{$c[$i]}
而不是
${c[$i]}
的颜色
而不是$colors中的
同样,作为文档,您应该更喜欢
pgrep
命令,而不是将
ps
的输出变灰。如果我们假设字符串拆分是给定的,那么是的。如果输入是一对一行的,最好的做法是使用while/read循环拆分元素——这样我们就不会有全局扩展、基于IFS的拆分或其他类似的副作用。您的“simpler”命令有没有一个例子?它是否像“array=($($)”(((($)((ps-ef | grep pmon”))”?@AloneInTheDark,没有引号;只是
array=($(ps-ef | grep…)
--但这是一种不好的做法,有几个原因。@AloneInTheDark:当您使用
数组=($(命令))时
然后每个元素都用空格或新行分隔。因此,如果元素本身包含空格,则会将其分解为多个数组元素。有几种方法可以处理此问题;例如,在Charles的回答中适当地使用
IFS
colors=()
while IFS='' read -r color; do
    colors+=( "$color" )
done < <(get-color-list)