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

时间:2011-09-12 15:44:57

标签: bash variables 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}

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

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

2 个答案:

答案 0 :(得分:25)

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

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}

您还应该预先声明全局变量,如上所示。

管道在子壳中执行,正如Blagovest在评论中所指出的那样。使用process substitution instead(这是< <(commands)语法)将所有内容保存在同一个进程中,因此可以更改全局变量。

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

dpkg --list |grep '^ii.*linux-image'

少担心grep调用。

答案 1 :(得分:3)

这有点绕过你的问题(这是一个很好的问题),但你可以使用简单的方法获得相同的结果:

 _constr=($(dpkg --list | awk '/^ii.*linux-image/{print $2}'))

($(cmd))构造使用命令的输出初始化bash数组。

[me@home]$ echo ${_constr[*]}
linux-image-2.6.35-22-generic linux-image-2.6.35-28-generic linux-image-generic
[me@home]$ echo ${_constr[2]}
linux-image-generic

您可以使用${#_constr[*]}获取元素数量。

[me@home]$ echo ${#_constr[*]}
3