linux - 将命令的输出分配给全局数组,而不会在子 shell 之后丢失数组

标签 linux bash

我需要将命令的输出读取到数组并将它们存储起来,以便在我的脚本中使用。我的脚本是;

  let i=0
  declare -a array
  $PS -ef|$GREP -v grep|$GREP $NAME | $SED -n 's/.*-q\s\([0-9]\+\).*/\1/p' | while read line; do
    array[$i]=$line
    echo ${array[$i]}   
    (( i++ ))
    echo ${#array[@]}           
    done < <($PS -ef|$GREP -v grep|$GREP $NAME | $SED -n 's/.*-q\s\([0-9]\+\).*/\1/p')  
    echo ${#array[@]}

因此,当循环退出时,由于子 shell,数组的大小变为 0。有办法解决这个问题吗?

最佳答案

您似乎在管道的两端都有相同的输入:

foo | while read line; do
    ...
done <( foo )

尝试删除第一个以便 while 循环不会在子 shell 中执行:

while read line; do
    ...
done <( foo )

如果您使用的是 bash 4 或更高版本,则可以将 while 循环替换为调用 readarray:

readarray array <( foo )

关于linux - 将命令的输出分配给全局数组,而不会在子 shell 之后丢失数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11428501/

相关文章:

c++ - 如何查看到控制台的长 C++ 输出(仅显示结束部分)

linux - 如何thread_local!在 rust 中使用动态库?

linux - 'sudo -su' 到底是什么?

c++ - 进程被终止时智能指针的行为

linux - Bash 自动退出/注销 SSH session

linux - 在 unix 中查找两个文件之间差异的最快方法?

bash - 如何从ls中排除列入黑名单的文件?

linux - 在 if 语句中使用测试命令时出错

linux - popen ("tar xvf tarball.tar") 在调试中工作但在发布版本中不工作

bash - 如何为读取命令添加换行符?