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语句不显示预期的变量。
如何使变量的内容在循环外传播?
答案 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