免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 9939 | 回复: 13
打印 上一主题 下一主题

??bash下while循环变量值丢失 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-06-21 22:40 |只看该作者 |倒序浏览
本帖最后由 dickgz1z 于 2010-06-22 12:05 编辑
  1. #!/bin/sh
  2. for i in 1 2 3 4 5; do
  3.   a=0
  4.   b=10
  5.   c=20
  6.   while [ $i -gt 3 ]
  7.    do
  8.      a=`expr $a + 1`
  9.      b=`expr $b - 1`
  10.      c=`expr $c + 1`
  11.    done
  12.   echo "the value of a :${a}\nthe value of b :${b}\nthe value of c :${c}"
  13. done
复制代码
bash下经过while循环的变量值在循环结束后会丢失,这里我通过上面这个比较简单的例子说下,输出结果是:
  1. the value of a :0
  2. the value of b :10
  3. the value of c :20
  4. the value of a :0
  5. the value of b :10
  6. the value of c :20
  7. the value of a :0
  8. the value of b :10
  9. the value of c :20
复制代码
变量a,b,c的值并未改变。请问大家有遇到这样的问题吗?是怎样解决的?


P.S.:
QUOTE:试试这个应该对了
值初始化的位置有问题。按原while的写法,可以这样写,但是看上去怪怪的:
zenith518 发表于 2010-06-22 08:15




    其实不是值初始化的位置有问题,而是有时必须在每一次for循环里初始化变量值,例如把一个目录的所有文件放入for循环,以变量作为计数器计算每个文件的行数。至于把while换成if的做法虽然在此例可行,但换了其他情况if还是不能做读文件操作:
  1. for FILE in test/*.txt; do

  2. line_count=0

  3.   while read line

  4.    do

  5.      line_count=`expr $line_count + 1`

  6.    done<$FILE

  7.   echo "$FILE has $line_count lines."

  8. done
复制代码
像上面这段代码,line_count是可以获得test目录下每个文件的行数的,但如果换成cat $FILE|while read line ,line_count的值每一次都将是0。上例就是必须在每一次for循环开始时初始化变量的情况,幸亏用输入重定向的办法可以解决问题。

论坛徽章:
0
2 [报告]
发表于 2010-06-22 01:07 |只看该作者
这个死循环了吧。。。。。。

论坛徽章:
0
3 [报告]
发表于 2010-06-22 07:50 |只看该作者
  1. #!/bin/sh

  2. for i in 1 2 3 4 5; do
  3. a=0
  4. b=10
  5. c=20
  6. if [ $i -gt 3 ];then
  7. a=`expr $a + 1`
  8. b=`expr $b - 1`
  9. c=`expr $c + 1`
  10. fi
  11. echo "the value of a :${a}\nthe value of b :${b}\nthe value of c :${c}"
  12. done
复制代码

论坛徽章:
0
4 [报告]
发表于 2010-06-22 08:15 |只看该作者
本帖最后由 zenith518 于 2010-06-22 08:27 编辑

试试这个应该对了
值初始化的位置有问题。
  1. a=0
  2. b=10
  3. c=20
  4. for i in 1 2 3 4 5; do
  5. if [ $i -gt 3 ];then
  6. a=`expr $a + 1`
  7. b=`expr $b - 1`
  8. c=`expr $c + 1`
  9. fi
  10. echo "the value of a :${a}\nthe value of b :${b}\nthe value of c :${c}"
  11. done
复制代码
按原while的写法,可以这样写,但是看上去怪怪的:
  1. a=0
  2. b=10
  3. c=20
  4. for i in 1 2 3 4 5; do
  5. while [ $i -gt 3 ]; do
  6. a=`expr $a + 1`
  7. b=`expr $b - 1`
  8. c=`expr $c + 1`
  9. i=0
  10. done
  11. echo -e "the value of a :${a}\nthe value of b :${b}\nthe value of c :${c}"
  12. done
复制代码

论坛徽章:
1
水瓶座
日期:2013-11-04 13:16:13
5 [报告]
发表于 2010-06-22 09:52 |只看该作者
回复 4# zenith518


    这个while 会死循环吧

论坛徽章:
0
6 [报告]
发表于 2010-06-22 10:03 |只看该作者
LZ原来的那个会,我这个不会差一句 i=0

论坛徽章:
0
7 [报告]
发表于 2010-06-22 11:32 |只看该作者
{:3_198:}{:3_198:}{:3_198:}

论坛徽章:
0
8 [报告]
发表于 2010-06-22 12:02 |只看该作者
试试这个应该对了
值初始化的位置有问题。按原while的写法,可以这样写,但是看上去怪怪的:
zenith518 发表于 2010-06-22 08:15



    其实不是值初始化的位置有问题,而是有时必须在每一次for循环里初始化变量值,例如把一个目录的所有文件放入for循环,以变量作为计数器计算每个文件的行数。至于把while换成if的做法虽然在此例可行,但换了其他情况if还是不能做读文件操作:
  1. for FILE in test/*.txt; do
  2.   line_count=0
  3.   while read line
  4.    do
  5.      line_count=`expr $line_count + 1`
  6.    done<$FILE
  7.   echo "$FILE has $line_count lines."
  8. done
复制代码
像上面这段代码,line_count是可以获得test目录下每个文件的行数的,但如果换成cat $FILE|while read line ,line_count的值每一次都将是0。上例就是必须在每一次for循环开始时初始化变量的情况,幸亏用输入重定向的办法可以解决问题。

论坛徽章:
16
IT运维版块每日发帖之星
日期:2015-08-24 06:20:00综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00IT运维版块每日发帖之星
日期:2015-10-25 06:20:00IT运维版块每日发帖之星
日期:2015-11-06 06:20:00IT运维版块每日发帖之星
日期:2015-12-10 06:20:00平安夜徽章
日期:2015-12-26 00:06:302016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-04-15 06:20:00IT运维版块每日发帖之星
日期:2016-05-21 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-14 06:20:00
9 [报告]
发表于 2010-06-22 12:07 |只看该作者
:wink:

论坛徽章:
0
10 [报告]
发表于 2010-06-22 12:26 |只看该作者
  1. while [ $i -gt 3 ]

  2.    do

  3.      a=`expr $a + 1`

  4.      b=`expr $b - 1`

  5.      c=`expr $c + 1`

  6.      i=`expr $i + 1`

  7.    done

复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP