循环退出后的局部变量
退出循环后,出现局部变量问题。 ,可变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 ,而在循环内找到正确的值。
一个管道启动一个新的子shell,拥有自己的环境和变量空间。改为在循环结尾使用< tmp
。
是的,你正确的我修复它,现在它是工作,但我不知道管打开新subshel变量,因为我知道它只是一个输入缓冲区的新命令 – Leo 2010-01-13 21:12:03
我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
我认为这篇文章来解决此问题:http://www.linuxforums.org/forum/linux-programming-scripting/35016-bash-script-help-retrieving-variable-inside-loop.html – mingos 2010-01-13 20:51:08