循环退出后的局部变量

问题描述:

退出循环后,出现局部变量问题。 ,可变max结束值为0,尽管下面的代码:循环退出后的局部变量

max=0 
cat tmp|while read line 
do 
temp=$(echo $line|tr -d "\n"|wc -c) 
if [ $temp -gt $max ];then 

max=$temp 
echo $max 
fi 
done 
echo -n tmp $max 

cat tmp 
12345 
123456 

这是我收到的输出:

5 
6 
tmp 0 

我不明白为什么max退出循环后为0 ,而在循环内找到正确的值。

+0

我认为这篇文章来解决此问题:http://www.linuxforums.org/forum/linux-programming-scripting/35016-bash-script-help-retrieving-variable-inside-loop.html – mingos 2010-01-13 20:51:08

一个管道启动一个新的子shell,拥有自己的环境和变量空间。改为在循环结尾使用< tmp

+0

是的,你正确的我修复它,现在它是工作,但我不知道管打开新subshel​​变量,因为我知道它只是一个输入缓冲区的新命令 – Leo 2010-01-13 21:12:03

+2

我ams。 – 2010-01-13 21:16:30

max=0 
while read line 
do 
    temp=$(echo $line|tr -d "\n"|wc -c) 
    if [ $temp -gt $max ] 
    then 
     max=$temp 
     echo $max 
    fi 
done <tmp 
echo -n tmp $max 

之前的管道将所有内部环境都放入一个单独的shell中,从而形成一个单独的标识符上下文(本质上是一个新环境)。

通过<tmp文件重定向到while循环将使您的循环和变量都保持在同一执行上下文中。

while read line 
do 
    # your loop stuff 
done < tmp 

根据bash手册页,管道中的每个命令都在子shell中执行。也就是说,while循环运行在一个子shell中,并且只修改该子shell中变量max的值。

子壳变量不会传播回调用shell,该shell运行echo命令,因此仍会看到初始零值。

如果您运行在同一子shell回声(注意大括号),将工作:

max=0 
cat tmp|{ 
    while read line 
    do 
     temp=$(echo $line|tr -d "\n"|wc -c) 
     if [ $temp -gt $max ];then 
      max=$temp 
     fi 
    done 
    echo -n tmp $max 
} 

如果您需要在外壳进一步的计算值,你需要使用命令替换像这样:

max=0 
max=$(cat tmp|{ 
    while read line 
    do 
     temp=$(echo $line|tr -d "\n"|wc -c) 
     if [ $temp -gt $max ];then 
      max=$temp 
     fi 
    done 
    echo -n $max 
}) 
echo tmp $max 

这里是awk中的一行代码。

$ awk 'length>t{t=length}END{print t}' file 
6