将命令的输出存储到数组中


23

这是命令:pdc status -a 2>&1 | grep 'okay'它给出以下输出

[okay     ]: you are currently listening: 33
[okay     ]: you are currently listening: 22
[okay     ]: you are currently listening: 11

我已经在外壳脚本文件中编写了此命令。但是我想将此命令的输出存储到数组中,以便对数组中的每个索引值进行一些处理。

如何将该命令的输出存储到数组中?

Answers:


24

如果只想在每行的末尾添加数字,请执行以下操作:

numbers=( $(pdc ... | grep -oP 'okay.+?\K\d+$') )

如果要将每一行存储到数组中

mapfile -t lines < <(pdc ...)

要从数组中检索数据:

for (( i=0; i<${#numbers[@]}; i++ )); do echo ${numbers[i]}; done
echo
printf "%s\n" "${lines[@]}"
33
22
11

[okay   ]: you are currently listening: 33
[okay   ]: you are currently listening: 22
[okay   ]: you are currently listening: 11

1
语法错误:当我使用时发生重定向意外mapfile -t array < <(grep.....)
Sachith Muhandiram '17

您是否正在使用bash或其他外壳程序?
格伦·杰克曼

20

首先,您不一定需要数组,而是可以逐行处理输出:

pdc status -a 2>&1 | grep 'okay' | while read line; do somecommand "$line"; done

如果确实需要阵列,Glenn Jackman 已经为您提供了最佳方法,但这是另一种方法:

#!/bin/bash
IFS=$'\n'
array=($(pdc status -a 2>&1 | grep 'okay'))

说明:

  • $IFS=$'\n'$IFS是bash的输入字段分隔符,将其设置为仅换行符(\n)可确保您的输出行不会在空格上分割,以便您可以将每行保存为单独的数组元素。否则,命令输出中的每个单词都会是一个不同的元素。

    根据您要执行的操作,保存$IFS数组的旧值并在读取数组后还原它可能是一个好主意:

    oldifs="$IFS"
    IFS=$'\n'
    array=($(echo -e "foo bar\nbaz bar"))
    IFS="$oldifs"
  • $(command):这称为命令替换,它允许您将命令的输出保存在变量中。有两种方法可以做到这一点:

    var=$(command)

    var=`command`

    在这两个中,$()更好是因为:

    • 它可以处理嵌套命令:

      var=$(command1 $(command 2))

      例如 var=$(cat $(find ~/))

    • 它几乎没有引用问题,并且语法更简洁。看到这里更多。


6

使用readarray内置的另一种更直观的方法(请参阅参考资料help -m readarray):

readarray -t array <<< "$(pdc status -a 2>&1 | grep 'okay')"

接下来,要打印一个数组元素,假设第二个元素,您可以使用:

echo "${array[1]}"

要在单独的行上打印所有数组元素,可以使用:

printf -- "%s\n" "${array[@]}"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.