学习bash里的getopts

source:http://blogold.chinaunix.net/u/11768/showart_686774.html

getopts optstring varname [arg ...]


optstring  option字符串,会逐个匹配
varname    每次匹配成功的选项
arg        参数列表,没写时它会取命令行参数列表

$OPTIND    特殊变量,option index,会逐个递增
$OPTARG    特殊变量,option argument,不同情况下有不同的值


细则1:当optstring以”:“开头时,getopts会区分invalid option错误和miss option argument错误。
      invalid option时,varname会被设成?,$OPTARG是出问题的option;
      miss option argument时,varname会被设成:,$OPTARG是出问题的option。
      如果optstring不以”:“开头,invalid option错误和miss option argument错误都会使
      varname被设成?,$OPTARG是出问题的option。

细则2:当optstring中的字母跟”:“时,表明该option可接参数,参数(argument)放在$OPTARG中;
      如果缺参数,且optstring是以”:“开头,则varname的值会是:,$OPTARG是该option,
      否则varname的值是?,$OPTARG是该option。(参照细则1)

简单的sample:

#!/bin/bash

SKIPBLANKS=
TMPDIR=/tmp
CASE=lower

while getopts :bt:u arg
do
    case $arg in
        b) 
SKIPBLANKS=TRUE
                  echo "If skip blanks? $SKIPBLANKS"
                  ;;

        t) if [ -"$OPTARG" ]
                    then
                 
   TMPDIR=$OPTARG
                    echo "Temp dir is $TMPDIR."
                  else
                    echo "$0: $OPTARG is not a directory." >&2
                    exit 1
                  fi
                  ;;

        u) 
CASE=upper
                  echo "Case sensitivity is $CASE."
                  ;;

        :) echo "$0: Must supply an argument to -$OPTARG." >&2
                  exit 1
                  ;;

        \?) echo "Invalid option -$OPTARG ignored." >&2
                  ;;
        esac
done

source: http://blog.sina.com.cn/s/blog_56cf6ef50100q2f8.html

  1. while getopts ":abcde:fg" Option
  2. # Initial declaration.
  3. # 开始的声明.
  4. # a, b, c, d, e, f, 和 g 被认为是选项(标志).
  5. # e 选项后边的:提示,这个选项带一个参数.
  6. do
  7. case $Option in
  8. a ) # Do something with variable 'a'.
  9. echo aaa
  10. ;;
  11. b ) #
  12. echo bbb
  13. ;;
  14. e) # Do something with 'e', and also with $OPTARG,
  15. echo eee with $OPTARG
  16. ;;
  17. g ) # 对选项'g'作些操作.
  18. echo ggg
  19. ;;
  20. esac
  21. done
  22. shift $(($OPTIND - 1))
  23. # 将参数指针向下移动.
复制代码

注释掉  shift $(($OPTIND - 1)) 程序也照常运行,那这个有什么用呢?

由于  $OPTIND 总是存储原始$*中下一个要处理的元素位置,程序运行到这句话的时候,指针后面的参数还都是没有处理过的,而指针前的参数已经全部处理过了。 通过 shift $(($OPTIND - 1)) 的处理,$*中就只保留了除去选项内容的参数(未处理过的参数),可以在其后进行正常的shell编程处理了。
下面是在网上搜到的例子:
echo $*
while getopts ":a:bc" opt
do
        case $opt in
                a ) echo $OPTARG
                    echo $OPTIND;;
                b ) echo "b $OPTIND";;
                c ) echo "c $OPTIND";;
                ? ) echo "error"
                    exit 1;;
        esac
done
echo $OPTIND
shift $(($OPTIND - 1))
echo $0
echo $*

运行结果:
#./test -a 12 -bc 34
-a 12 -bc 34
12
3
b 3
c 4
4
./test
34

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值