我需要将脚本中的命令输出读入数组。该命令例如是:
ps aux | grep | grep | x 它逐行给出输出,如下所示:
10 20 30 我需要从命令输出中读取值到数组中,然后如果数组的大小小于3,我将做一些工作。 问题来源于stack overflow
要获得数组中命令的输出,基本上有两种方法:
如果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]")' 在这里,我们正在使用外壳!
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。