将变量的值传播到循环外部

mas*_*uch 15 variables bash loops

dpkg --list |grep linux-image |grep "ii  " | while read line
do
  arr=(${line})
  let i=i+1
  _constr+="${arr[2]} "
done
echo $i
echo ${_constr}
Run Code Online (Sandbox Code Playgroud)

循环外部的echo语句不显示预期变量.

我应该如何使变量的内容在循环外传播?

Sor*_*gal 29

问题是管道,而不是循环.试试这种方式

let i=0
declare -a arr

while read -r line ; do
    arr=(${line})
    let i=i+1
    _constr+="${arr[2]} "
done < <(dpkg --list |grep linux-image |grep "ii  ")

echo $i
echo ${_constr}
Run Code Online (Sandbox Code Playgroud)

您还应该为了清晰度预先声明全局变量,如上所示.

正如布拉戈维斯特在评论中指出的那样,管道在子壳中执行.使用进程替换(这是< <(commands)语法)将所有内容保持在同一进程中,因此可以更改全局变量.

顺便提一下,您的管道也可以改进

dpkg --list |grep '^ii.*linux-image'
Run Code Online (Sandbox Code Playgroud)

一个少grep担心的调用.