免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 14481 | 回复: 17

BASH中变量的作用域之谜 [复制链接]

论坛徽章:
0
发表于 2006-08-14 16:50 |显示全部楼层
请看下面的片断
---------------------------------------------



  1. FILE_LIST="abcd"

  2. echo "$NEW_FILES_LIST" | while read DATA_LINE
  3. do
  4.         TMP_PATH=$(echo "${DATA_LINE}" | sed -n 's/\[\(.\+\)\]/\1/gp')
  5.         if [ -n "$TMP_PATH" ]; then
  6.             FILE_PATH="${TMP_PATH}"
  7.         else
  8.             FILE_LIST="${FILE_LIST} "$(echo "${DATA_LINE}" | sed "s?[0-9]\\+\\. ?${FILE_PATH}/?g")
  9.             echo "filelist=${FILE_LIST}"  #这儿已经出现正确的值了
  10.         fi
  11. done

  12. echo FILE_LIST==${FILE_LIST}
复制代码


为何最后一行的echo输出:
FILE_LIST==abcd


[ 本帖最后由 jruv 于 2006-8-14 19:29 编辑 ]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
发表于 2006-08-14 17:24 |显示全部楼层
在while里export FILE_LIST试试看

论坛徽章:
0
发表于 2006-08-14 17:28 |显示全部楼层
还是不行啊,不管在while外还是while里export都不行,结果还是abcd

论坛徽章:
0
发表于 2006-08-14 17:42 |显示全部楼层
我的实验结果

  1. # vi t
  2. "t" 10 lines, 79 characters
  3. a=abcd
  4. while read aa
  5. do
  6. echo $a
  7. echo $aa
  8. a=$aa
  9. break
  10. done
  11. echo $a
  12. echo $aa
  13. ~
  14. ~
  15. "t" 10 lines, 79 characters

  16. # ./t
  17. YY
  18. abcd
  19. YY
  20. YY
  21. YY
复制代码

第一个YY为我输入的。也就是要read 的。实验表明可以替换的。。
是不是你用了管道的原因,才不能改过来啊????

论坛徽章:
0
发表于 2006-08-14 17:57 |显示全部楼层
好像是的

  1. #!/bin/bash

  2. FILE_LIST="xxxxx"
  3. echo "something" | if true
  4. then
  5.          FILE_LIST=${FILE_LIST}-abcd
  6.          echo "filelist=${FILE_LIST}"
  7. fi
  8.                                          
  9. echo FILE_LIST==${FILE_LIST}
复制代码

输出是
filelist=xxxxxabcd
FILE_LIST==xxxxx



  1. #!/bin/bash

  2. FILE_LIST="xxxxx"
  3. if true
  4. then
  5.          FILE_LIST=${FILE_LIST}-abcd
  6.          echo "filelist=${FILE_LIST}"
  7. fi
  8.                                          
  9. echo FILE_LIST==${FILE_LIST}
复制代码

输出是
filelist=xxxxx-abcd
FILE_LIST==xxxxx-abcd
真是我所期望的值

难道管道改变了某些东西? 谁能解释一下呢

论坛徽章:
0
发表于 2006-08-14 18:16 |显示全部楼层
管道单独生成一个进程。可能是这个原因。

论坛徽章:
0
发表于 2006-08-14 18:26 |显示全部楼层
那又没有什么解决方法呢

论坛徽章:
0
发表于 2006-08-14 22:16 |显示全部楼层

7楼说得是对的

原帖由 scode 于 2006-8-14 18:16 发表
管道单独生成一个进程。可能是这个原因。


shell 启动一个子shell来处理管道
在while循环中的FILE_LIST是子shell的变量,用export也不可以向父shell传递

论坛徽章:
0
发表于 2006-08-15 00:35 |显示全部楼层
最简单的方法是用ksh
#!/bin/ksh
这是BASH的while的重定向产生的

论坛徽章:
0
发表于 2006-08-15 09:21 |显示全部楼层
原帖由 unicornx 于 2006-8-14 22:16 发表


shell 启动一个子shell来处理管道
在while循环中的FILE_LIST是子shell的变量,用export也不可以向父shell传递


那如何向父shell传递变量呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP