免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
论坛 程序设计 Shell getopts
最近访问板块 发新帖
查看: 2430 | 回复: 7
打印 上一主题 下一主题

getopts [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-08-18 14:41 |只看该作者 |倒序浏览
本帖最后由 kala_fly 于 2010-08-19 10:46 编辑

最近想编写带参数的脚本,问题关于getopts的问题。代码如下:
  1. while getopts abc: OPT
  2. do
  3.     case $OPT in
  4.                  a)
  5.                          ehco a
  6.                      ;;
  7.                  b)
  8.                          echo b
  9.                  ;;
  10.                    c)
  11.                        Argument1=${OPTARG}
  12.                        Argument2= ???
  13.                           ............3=??
  14.                        echo "$Argument1"
  15.                        echo "$Argument2"
  16.                        echo "$Argument3"
  17.                            ..
  18.                            ..
  19.                   ;;
  20.                     
  21.       esac
  22. done
  23. shift $(($OPTIND -1))
复制代码
./script -c arg1 arg2 arg3 -a -b

想传递多个参数到脚本的某一个选项(如-c)中,不知道如何实现。请大家帮忙看看?

PS: 只知道,shift $(($OPTIND -1)) 是所有的参数像左移$OPTIND -1 个位,但不知道目的是什么?

论坛徽章:
0
2 [报告]
发表于 2010-08-18 14:54 |只看该作者
回复 1# kala_fly


    shift可以理解为把最左边的参数弹出

论坛徽章:
0
3 [报告]
发表于 2010-08-18 15:28 |只看该作者
any updates?

论坛徽章:
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
4 [报告]
发表于 2010-08-18 16:23 |只看该作者
回复 1# kala_fly


    比如脚本执行 /bin/sh Arg1 arg2 ......arg{X}
shift 默认把Arg1 左移,此时就相当于/bin/sh Arg2 ......Arg{X-1}

shift 2就等于把前2个位置参数给移走了,此时第一个参数是arg3,其他参数也随之左移。

论坛徽章:
0
5 [报告]
发表于 2010-08-18 16:31 |只看该作者
回复 4# expert1


   LZ问的是目的。。?咱们都答非所问
  其实就是把命令行参数都识别完以后,如果有剩余的其它命令行参数,可以取出来。

论坛徽章:
0
6 [报告]
发表于 2010-08-18 17:00 |只看该作者
本帖最后由 kala_fly 于 2010-08-18 17:06 编辑
回复  expert1


   LZ问的是目的。。?咱们都答非所问
  其实就是把命令行参数都识别完以后,如果有剩 ...
好看的附件 发表于 2010-08-18 16:31


这个SHIFT的用法,我再研究吧。觉得还是要看程序的需求,用不到光想可能有点麻烦。

PS: 已经可以通过别的方法来解决向一个 Option 传递 多个argument 了。下面是我的代码。
  1. #!/bin/sh

  2. while getopts d:a:v OPT
  3. do
  4.         case $OPT in
  5.                 d) parameter=($OPTARG);
  6.                 echo "${#parameter[@]}"
  7.                 num_elements="${#parameter[@]}"
  8.                 for element in $(seq 0 $(($num_elements - 1 )))
  9.                 do
  10.                         alias[$element]=${parameter[$element]}
  11.                         echo "domain alias $(($element + 1)) are ${alias[$element]}"
  12.                 done
  13.                 ;;
  14.                 a)
  15.                 shift $OPTIND
  16.                 echo $2
  17.                 echo "do a";echo "OPTIND=${OPTIND}"
  18.                 ;;
  19.                 v)
  20.                 echo "version";echo "OPTIND=${OPTIND}"
  21.                 ;;
  22.         esac
  23. done
复制代码
借鉴了数组的概念。{:2_168:}
还有要说的就是 -d 的参数 暂时还得用“”或''  引用
  1. ./test_opts.sh -d "abc.com bcd.org efg.net"
  2. 3
  3. domain alias 1 are abc.com
  4. domain alias 2 are bcd.org
  5. domain alias 3 are efg.net
复制代码
如果不用关闭字符,还在进一步研究中。谢谢回复的同志~

论坛徽章:
0
7 [报告]
发表于 2010-08-19 08:03 |只看该作者
回复 1# kala_fly
  1. [Bob@hzling05:~/test]-No.30-$ cat varshift
  2. #!/bin/bash
  3. count=1
  4. while [ "$*" ]; do
  5.         echo "para #$count = $1"
  6.         count=$[ $count + 1 ]
  7.         shift
  8. done
  9. [Bob@hzling05:~/test]-No.31-$ ./varshift 1 2 3 4 5
  10. para #1 = 1
  11. para #2 = 2
  12. para #3 = 3
  13. para #4 = 4
  14. para #5 = 5
复制代码

论坛徽章:
0
8 [报告]
发表于 2010-08-19 09:01 |只看该作者
本帖最后由 kala_fly 于 2010-08-19 09:20 编辑
回复  kala_fly
xiaopan3322 发表于 2010-08-19 08:03



不知道啥意思,不过同样感谢你。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP