免费注册 查看新帖 |

Chinaunix

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

[shell] getopts的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-01-04 20:45 |只看该作者 |倒序浏览
本帖最后由 xmbbx 于 2011-01-05 09:55 编辑

看代码:

  1. #!/bin/bash

  2. function LOG
  3. {
  4.     while getopts 't:' OPT
  5.     do
  6.         case $OPT in
  7.             t)
  8.                 LABEL="$OPTARG";;
  9.             ?)
  10.                 echo "Usage: LOG [options] Message";;
  11.         esac
  12.     done
  13.     shift $(($OPTIND-1))
  14.     MSG=${1:-""}
  15.     echo "$(date +"%b %d %X") ${LABEL}: ${MSG}"
  16. }

  17. LOG -t DEBUG "test test1"
  18. LOG -t ERROR "test test2"
  19. LOG -t ERROR "test test3"
  20. LOG -t INFO "test test4"
复制代码
运行的结果达不到预期:
[root@localhost root]# bash tt.sh
Jan 04 20:38:43 DEBUG: test test1
Jan 04 20:38:43 DEBUG: test test2
Jan 04 20:38:43 DEBUG: test test3
Jan 04 20:38:43 DEBUG: test test4

预期应该是这样的:
[root@localhost root]# bash tt.sh
Jan 04 20:38:43 DEBUG: test test1
Jan 04 20:38:43 ERROR : test test2
Jan 04 20:38:43 ERROR: test test3
Jan 04 20:38:43 INFO: test test4

什么问题呢?

论坛徽章:
0
2 [报告]
发表于 2011-01-05 09:54 |只看该作者
这个很奇怪啊

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
3 [报告]
发表于 2011-01-05 10:30 |只看该作者
看代码:运行的结果达不到预期:
[root@localhost root]# bash tt.sh
Jan 04 20:38:43 DEBUG: test test ...
xmbbx 发表于 2011-01-04 20:45


试试....
  1. #!/bin/bash

  2. function LOG
  3. {
  4.     local LABEL=$1
  5.     local MSG=$2
  6.     echo "$(date +"%b %d %X") ${LABEL}: ${MSG}"
  7. }

  8. LOG  DEBUG "test test1"
  9. LOG  ERROR "test test2"
  10. LOG  ERROR "test test3"
  11. LOG  INFO "test test4"
复制代码

论坛徽章:
0
4 [报告]
发表于 2011-01-05 11:19 |只看该作者
回复 3# jason680


    呵呵,这个是一种办法。
我就是想知道为啥用getopts不行。

论坛徽章:
0
5 [报告]
发表于 2011-01-05 11:58 |只看该作者
[root@localhost shell]# sh -x  test
+ LOG -t DEBUG 'test test1'
+ getopts t: OPT
+ case $OPT in
+ LABEL=DEBUG
+ getopts t: OPT
+ shift 2

+ MSG='test test1'
++ date '+%b %d %X'
+ echo ' 1月 05 11时55分41秒 DEBUG: test test1'
1月 05 11时55分41秒 DEBUG: test test1
+ LOG -t ERROR 'test test2'
+ getopts t: OPT
+ shift 2

+ MSG='test test2'
++ date '+%b %d %X'
+ echo ' 1月 05 11时55分41秒 DEBUG: test test2'
1月 05 11时55分41秒 DEBUG: test test2

论坛徽章:
0
6 [报告]
发表于 2011-01-05 15:21 |只看该作者
回复 5# jiaminqiang


    不是很明白,第二次调用时没有认到-t? 要怎么改。

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
7 [报告]
发表于 2011-01-05 15:48 |只看该作者
回复  jason680


    呵呵,这个是一种办法。
我就是想知道为啥用getopts不行。
xmbbx 发表于 2011-01-05 11:19



就我所知getopts用在command line
你把它用在function上,没有这样用的经验.....
(你这样用有问题,更证明不应该这样用...)

个人认为:
command Line会有各式各样的问题,而且下command的人不一定是你
   所以无法得知使用者要怎么调用你的脚本程式...
  但function是你自己是调用的...为什么要那么累.....
  code变多,也没有比较好懂,多此一举....

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
8 [报告]
发表于 2011-01-05 16:00 |只看该作者
本帖最后由 jason680 于 2011-01-05 16:05 编辑
回复  jiaminqiang


    不是很明白,第二次调用时没有认到-t? 要怎么改。
xmbbx 发表于 2011-01-05 15:21


找到了....
getopts的变数有 OPTIND与OPTARG
你要把OPTIND设回1才可以

function LOG
{
    OPTIND=1
    while getopts 't:' OPT
    do
       ...

# bash LOG.sh
Jan 05 03:55:03 PM DEBUG: test test1
Jan 05 03:55:03 PM ERROR: test test2
Jan 05 03:55:03 PM ERROR: test test3
Jan 05 03:55:03 PM INFO: test test4

论坛徽章:
0
9 [报告]
发表于 2011-01-05 16:13 |只看该作者
回复 8# jason680


    非常感谢,解决了我郁闷1天的疑惑。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP