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 [ -d "$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
- while getopts ":abcde:fg" Option
- # Initial declaration.
- # 开始的声明.
- # a, b, c, d, e, f, 和 g 被认为是选项(标志).
- # e 选项后边的:提示,这个选项带一个参数.
- do
- case $Option in
- a ) # Do something with variable 'a'.
- echo aaa
- ;;
- b ) #
- echo bbb
- ;;
- e) # Do something with 'e', and also with $OPTARG,
- echo eee with $OPTARG
- ;;
- g ) # 对选项'g'作些操作.
- echo ggg
- ;;
- esac
- done
- shift $(($OPTIND - 1))
- # 将参数指针向下移动.
复制代码
注释掉
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