51

我被困在一个小问题上。我有一个命令将输出通过管道传输到 awk 但我想将输出一个一个地捕获到一个数组中。

我的例子:

myarr=$(ps -u kdride | awk '{ print $1 }')

但这会将我的所有输出捕获到一个用逗号分隔的巨大字符串中:

output: PID 3856 5339 6483 10448 15313 15314 15315 15316 22348 29589 29593 32657 1

我还尝试了以下方法:

IFS=","
myarr=$(ps -u kdride | awk '{ print $1"," }')

But the output is: PID, 3856, 5339, 6483, 10448, 15293, 15294, 15295, 15296, 22348, 29589, 29593, 32657,
1

我希望能够将每个单独的 pid 捕获到它自己的数组元素中。设置IFS = '\n'不做任何事情并保留我的原始输出。我需要做哪些改变才能完成这项工作?

4

2 回答 2

95

添加额外的括号,如下所示:

myarr=($(ps -u kdride | awk '{ print $1 }'))

# Now access elements of an array (change "1" to whatever you want)
echo ${myarr[1]}

# Or loop through every element in the array
for i in "${myarr[@]}"
do
   :
  echo $i
done

另请参阅bash— 数组

于 2013-02-27T06:00:39.190 回答
3

使用 Bash 的内置映射文件(或其同义词readarray

mapfile -t -s 1 myarr < <(ps -u myusername | awk '{print $1}')

至少在 GNU/Linux 中你可以格式化输出ps,所以不需要awkand-s 1

mapfile -t myarr < <(ps -u myusername -o pid=)
于 2019-08-14T17:55:12.750 回答