免费注册 查看新帖 |

Chinaunix

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

[文本处理] 关于GETOPTS的疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-05-04 16:51 |只看该作者 |倒序浏览
写了一个脚本, 用getopts解析命令行参数,   在执行的时候, 调用方式不同, 执行结果不太一样,  不太理解, 请求各位帮助。

wang@wang-PC ~/tmp
$ . t4.sh -m3
0 days 0 hours 3 minutes 0 sec

wang@wang-PC ~/tmp
$ . t4.sh -m3
0 days 0 hours 0 minutes 0 sec

wang@wang-PC ~/tmp
$ sh t4.sh -m3
0 days 0 hours 3 minutes 0 sec

wang@wang-PC ~/tmp
$ sh t4.sh -m3
0 days 0 hours 3 minutes 0 sec

为什么用 . 调用的时候, 第二次执行就没有返回值?   而sh 方式调用 的时候就没有这个问题.

我知道shell调用的时候,  用. 和source是在当前的shell环境中执行的, 而sh是在当前环境中开启一个子shell运行脚本的, 不理解getopts在执行的时候怎么会有这

样的区别?  请帮忙解释一下。


$ cat t4.sh
#!/bin/bash
SECS=0
MINUTES=0
HOURS=0
DAYS=0

while getopts :s:m:h:d: opt
do
    case $opt in
      s) SECS=$OPTARG
         ;;
      m) MINUTES=$OPTARG
         ;;
      h) HOURS=$OPTARG
         ;;
      d) DAYS=$OPTARG
         ;;
      ?)
         echo "$OPTARG is not supported"
         exit 1
         ;;
    esac
done

echo "$DAYS days $HOURS hours $MINUTES minutes $SECS sec"

论坛徽章:
0
2 [报告]
发表于 2014-05-05 09:09 |只看该作者
回复 1# 420350501
  1. unset OPTIND
复制代码
at the end of your script.


   

论坛徽章:
0
3 [报告]
发表于 2014-05-05 10:57 |只看该作者
回复 2# runintostar

谢谢楼上兄弟, 试了一下可以,

查了一下资料:
getopts每次处理的时候, OPTIND都会指向下一个参数, 用 . 方式调用, 是在当前的shell环境中执行, 第一次执行完毕, OPTIND=2, 因为只有一个参数, 再次执行的shell找不到第二个参数, 所以就上面的执行结果了。




   

论坛徽章:
0
4 [报告]
发表于 2014-05-05 11:06 |只看该作者
回复 3# 420350501

没错, 用.方式执行和用sh方式执行结果不同, 说明是有变量的值被继承下来导致, man getopts后就可以看出是OPTIND的原因
   

论坛徽章:
1
水瓶座
日期:2013-11-04 13:16:13
5 [报告]
发表于 2014-05-05 15:02 |只看该作者
回复 1# 420350501


    一般都要shift 一下的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP