免费注册 查看新帖 |

Chinaunix

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

[讨论]一段shell实例代码中return的处理情况 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-02-21 10:11 |只看该作者 |倒序浏览
各位UNIX高手,请教一下这个奇怪的问题

最近突然喜欢上了shell,于是就到网上下载了《LINUX与UNIX SHELL编程指南》电子书籍学习,由于本人对于shell编程也是菜鸟一个,就首先尝试书籍中的脚本进行调试学习,在一个实例的调试学习中,发现脚本中的一个函数体user_level的return在执行的时候很蹊跷:
if [ "$MENU_USER" = "$USER" ]; then
FOUND="true"
case $PRIV in
yes|YES)
return 0
;;
按理说,执行了return 0之后应该结束这个函数,返回执行状态0,而不会继续执行user_level这个函数体的接下去的脚本代码,但是调试的情况是脚本执行了下面这段代码
if [ "$FOUND" = "false" ]; then
echo "Sorry $USER you have not been authorised to use this menu"
rm *.$$
exit 1
fi
于是就把这个函数体user_level单独拿出来写了一个简单的脚本执行,但是在这个脚本执行的结果确实意料之中的正常
附件中的menu2.sh就是书中实例
        testmenu.sh是只包含了user_level函数的脚本
调试这2个脚本时,需要在目录下面首先存在一个鉴权文件priv.user(这个文件里面的内容是用户是否有权限yes/no)
小虾调试的环境是UNIX system V版本的
请多指教

2006220155412.rar

2.23 KB, 下载次数: 59

脚本实例代码

论坛徽章:
0
2 [报告]
发表于 2006-02-21 17:41 |只看该作者
各位shell大虾,如果有调试过这个脚本实例,发现什么问题,请回复一下,小虾不甚感激

论坛徽章:
0
3 [报告]
发表于 2006-04-29 09:43 |只看该作者

return 无效


  1. function ttt()
  2. {
  3.     cat ffff | \
  4.     while read line
  5.     do
  6.         if [ 1 ]; then
  7.            echo returning...
  8.            return 1
  9.         fi
  10.     done
  11.     echo !!! should not reach here !!!
  12. }

  13. ttt
  14. echo $?
复制代码


测试输出为:
ttt
+ ttt
+ cat ffff
+ read line
+ [ 1 ]
+ echo returning...
returning...
+ return 1
+ echo !!! should not reach here !!!
!!! should not reach here !!!
echo $?
+ echo 0
0

return 1 无效!
如果去除这一行return有效:
    cat ffff | \

是不是生成了一个临时函数,return 只跳出该临时函数?
应该是跳出函数的...

[ 本帖最后由 jinq0123 于 2006-4-29 09:50 编辑 ]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
4 [报告]
发表于 2006-04-29 09:50 |只看该作者
测试的环境是什么?我认为最可能的原因是:
管道的命令在子shell中执行,而return命令无法跨越进程。

论坛徽章:
0
5 [报告]
发表于 2006-04-29 09:53 |只看该作者
楼主的例子没有管道,不过我没试过他的例子

论坛徽章:
0
6 [报告]
发表于 2006-04-29 09:58 |只看该作者
可能是因为管道内return的原因。
如何简单的改一下实现函数返回呢?


  1. function ttt()
  2. {
  3.     cat ffff | \
  4.     if [ 1 ]; then
  5.            echo returning...
  6.            return 1
  7.     fi
  8.     echo !!! should not reach here !!!
  9. }

  10. ttt
  11. echo $?
复制代码

论坛徽章:
0
7 [报告]
发表于 2006-04-29 10:08 |只看该作者
管道后return无效


  1. function ttt()
  2. {
  3.     cat ffff | (echo returning...; return 1)
  4.     echo !!! should not reach here !!!
  5. }

复制代码


ttt
+ ttt
+ cat ffff
+ echo returning...
returning...
+ return 1
+ echo !!! should not reach here !!!
!!! should not reach here !!!
echo $?
+ echo 0
0

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
8 [报告]
发表于 2006-04-29 10:22 |只看该作者
楼主的测试都是在sysv下做的么?Bourne shell还是ksh?
sysv下的Bourne shell比较特殊的。

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
9 [报告]
发表于 2006-04-29 10:23 |只看该作者
To:jinq0123
明白了什么原因,改起来就不难了。

—————————————
原来是你翻出来个老贴子,晕!^_^

[ 本帖最后由 woodie 于 2006-4-29 10:26 编辑 ]

论坛徽章:
0
10 [报告]
发表于 2006-04-29 10:29 |只看该作者
管道后设变量都不行。


  1. function ttt()
  2. {
  3.     _T=123
  4.     cat ffff | (echo xxxx; _T=555)
  5.     echo $_T
  6. }

  7. ttt
复制代码


输出123

我用的是Linux的bash.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP