![将命令的输出存储到数组中](https://linux22.com/image/1045648/%E5%B0%86%E5%91%BD%E4%BB%A4%E7%9A%84%E8%BE%93%E5%87%BA%E5%AD%98%E5%82%A8%E5%88%B0%E6%95%B0%E7%BB%84%E4%B8%AD.png)
这是命令: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 脚本文件中写了这个命令。但我想将此命令的输出存储到数组中,以便对数组中的每个索引值进行一些处理。
我如何将该命令的输出存储到数组中?
答案1
如果您只想要每行末尾的数字:
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
答案2
首先,您不一定需要数组,要逐行处理输出,您可以执行以下操作:
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 ~/))
它的引用问题少得多,语法也更清晰。请参阅这里了解更多信息。
答案3
还有一种更直观的方式,使用readarray
内置函数(参见help -m readarray
):
readarray -t array <<< "$(pdc status -a 2>&1 | grep 'okay')"
接下来,要打印数组元素,比如说第二个元素,您可以使用:
echo "${array[1]}"
要在单独的行上打印所有数组元素,可以使用:
printf -- "%s\n" "${array[@]}"