开发者社区> 问答> 正文

将命令输出读入Bash中的数组

我需要将脚本中的命令输出读入数组。该命令例如是:

ps aux | grep | grep | x 它逐行给出输出,如下所示:

10 20 30 我需要从命令输出中读取值到数组中,然后如果数组的大小小于3,我将做一些工作。 问题来源于stack overflow

展开
收起
保持可爱mmm 2020-02-08 13:23:20 470 0
1 条回答
写回答
取消 提交回答
  • 要获得数组中命令的输出,基本上有两种方法:

    如果Bash≥4,则使用mapfile效率最高:

    mapfile -t my_array < <( my_command ) 否则,将循环读取输出(速度较慢,但​​很安全):

    my_array=() while IFS= read -r line; do my_array+=( "$line" ) done < <( my_command ) 您可能会看到很多这样的东西:

    my_array=( $( my_command) ) 但是不要使用它!看看它是怎么破裂的:

    $ # this is the command used to test: $ echo "one two"; echo "three four" one two three four $ my_array=( $( echo "one two"; echo "three four" ) ) $ declare -p my_array declare -a my_array='([0]="one" [1]="two" [2]="three" [3]="four")' $ # Not good! now look: $ mapfile -t my_array < <(echo "one two"; echo "three four") $ declare -p my_array declare -a my_array='([0]="one two" [1]="three four")' $ # Good! 然后有人会建议使用IFS=$'\n'来解决此问题:

    $ IFS=$'\n' $ my_array=( $(echo "one two"; echo "three four") ) $ declare -p my_array declare -a my_array='([0]="one two" [1]="three four")' $ # It works! 但是,现在让我们使用另一个命令:

    $ echo "* one two"; echo "[three four]" * one two [three four] $ IFS=$'\n' $ my_array=( $(echo "* one two"; echo "[three four]") ) $ declare -p my_array declare -a my_array='([0]="* one two" [1]="t")' $ # What? 那是因为我t在当前目录中有一个文件…并且该文件名与glob 匹配[three four]…此时,有些人建议使用set -f来禁用globbing:但是要看一下:您必须进行更改IFS并使用set -f才能修复破损的技术(您甚至还没有真正修复它)!这样做时,我们实际上是在与 shell进行斗争,而不是与shell一起工作。

    $ mapfile -t my_array < <( echo "* one two"; echo "[three four]") $ declare -p my_array declare -a my_array='([0]="* one two" [1]="[three four]")' 在这里,我们正在使用外壳!

    2020-02-08 13:23:37
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载