getopts
时间:2010-08-23 来源:nianzong
ENVIRONMENT VARIABLES
OPTARGstores the value of the option argument found by getopts.
OPTINDcontains the index of the next argument to be processed.
关于OPTIND解释很好懂,是"下一个选项的索引值". 但是实际输出我是完全搞不懂. 经过查阅众多文章和讨论帖,加上自己的实践,终于对这个变量有了一个相对清晰的了解.#OPTIND 记录准备分析(即下一次分析)的第几个参数,如果我们不使用function,而是直接作为脚本,每次执行OPTIND将重新初始化,但是如果我们使用 function的方式,OPTIND将保持上次的值,即getopts接着分析第N个参数,例如第5个参数,所以需要unset,以保证正确。如果我们 用-ab表示-a -b,当分析完-a之后,OPTIND并不加一,保持原值,下次仍然分析该位置参数,如果-b arg,则OPTIND加二。所以我们不需要在getopts中进行shift,可以在完成所有getopts分析后,统一进行shift $(($OPTIND - 1))
关键点: 要搞清楚"自己的索引值"和"下一个选项的索引值"
while getopts ":d:ef" opt; do最前面的冒号是用来屏蔽输出自带错误信息的.
这里,第一个冒号表示忽略错误(例如出现了不认识的参数),并在脚本中通过::)来处理这样的错误;字母d则表
示,接受参数-d;d后面的冒号表示参数d接收值,即“-d 9”这样的形式;(这里opt变量,可以在while循环中
引用当前找到的参数,试试输出$opt试试)
If the first character of optstring is a colon, silent error reporting is used.
举例分析: getopts.sh
#!/bin/bash
while getopts ":ab:c:" opt
do
case $opt in
a)
echo "$opt | $OPTIND | $OPTARG";
;;
b)
echo "$opt | $OPTIND | $OPTARG";
;;
c)
echo "$opt | $OPTIND | $OPTARG";
;;
\?) echo "no this option"
;;
esac
done
echo "$OPTIND"
echo "$@||$#||$1,$2,$3,$4";
shift $(($OPTIND-1));
echo "$@||$#";
#END
第一种情形:
daihj@51sa:~$ sh getopts.sh -a -b "b b" -c "c c"
a | 2 |
b | 4 | b b
c | 6 | c c
6
-a -b b b -c c c||5||-a,-b,b b,-c
||0
#$OPTIND的初始值为1,-a选项自身的索引为1,那么它下一个选项的索引自然是2; -b位置时,$OPTIND此时要加2,而不是加1,因为-b拥有自己的参数, 所以$OPTIND此时变成4; 同理, 到-c选项时$OPTIND也是加2,最后$OPTIND为6.
daihj@51sa:~$ sh getopts.sh -ab "b b" -c "c c"
a | 1 |
b | 3 | b b
c | 5 | c c
5
#$OPTIND为1,因为下一个选项-b与-a写成了-ab的形式,所以到b选项时$OPTIND的索引值保持不变,仍旧为1; c选项时的$OPTIND加2,
daihj@51sa:~$ sh getopts.sh -b "b b" -c "c c"
b | 3 | b b
c | 5 | c c
5
-b b b -c c c||4||-b,b b,-c,c c
||0
daihj@51sa:~$ sh getopts.sh -b "b b" -c "c c"
b | 3 | b b
c | 5 | c c
5
-b b b -c c c||4||-b,b b,-c,c c
||0
http://www.mkssoftware.com/docs/man1/getopts.1.asp
http://www.adp-gmbh.ch/unix/shell/getopts.html
http://aplawrence.com/Unix/getopts.html
http://blog.csdn.net/flowingflying/archive/2010/01/03/5126066.aspx
相关阅读 更多 +