当前位置: 首页>>技术教程>>正文


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

问题描述

这是命令: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

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

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

最佳回答

如果您只想要每行末尾的数字:

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

次佳回答

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

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

如果您确实需要阵列,Glenn Jackman already gave 您是最好的方法,但这是另一种方法:

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

解释:

  • $IFS=$'\n'$IFS 是 bash 的 input field separator ,将其设置为仅换行符( \n )可确保您的输出行不会在空格上拆分,以便您可以将每一行保存为单独的数组元素。没有这个,你的命令输出的每个单词都会是一个不同的元素。

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

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

    • 它可以处理嵌套命令:

      var=$(command1 $(command 2))
      

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

    • 它在引用方面的问题要少得多,并且语法更清晰。有关更多信息,请参见 here

第三种回答

使用 readarray 内置的另一种更直观的方式(参见 help -m readarray ):

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

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

echo "${array[1]}"

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

printf -- "%s\n" "${array[@]}"

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/12405.html,未经允许,请勿转载。