shell中getopts用于获取用户在命令下的参数,然后根据参数进行不同的执行。
getopts配合case进行操作时有两个隐含变量:一个是OPTARG,用来取当前选项的值;另外一个是OPTIND,代表当前选项在参数列表中的位移,OPTIND是一个特殊的变量,它的初始值是1,每次getopts处理完一个命令参数后就递增它,得到getopts要处理的下一个参数。
通过一个例子说明其使用方法:
while getopts 'd:Dm:f:t:' OPT
do
case $OPT in
d)
DEL_DAYS="$OPTARG"
;;
D)
DEL_ORIGINAL='yes'
;;
f)
DIR_FROM="$OPTARG"
;;
m)
MAILDIR_NAME="$OPTARG"
;;
t)
DIR_TO="$OPTARG"
;;
?)
echo "unkonw argument"
exit 1
;;
esac
done
shift $(($OPTIND - 1))
- getopts后面的每个字母代表一个选项,后面带:的意味着选项除了定义本身之外,还会带上一个参数作为选项的值,比如d:在实际的使用中就会对应-d 20,选项的值就是20;
- getopts字符串中没有跟随:的是开关型选项,不需要指定值,相当于true/false,只要带了这个参数就是true;
- 如果命令行中包含了没有在getopts列表中的选项,会有警告信息;
- 如果在整个getopts字符串前面也加上个:,就能消除警告信息了。
- case中的最后一个选择?,代表如果出现了不认识的选项所进行的操作
- getopts在处理参数的时候,处理一个开关型选项,OPTIND加1,处理一个带值的选项参数,OPTIND则会加2;选项参数识别完成之后,如果要取剩余的其它命令行参数,可以使用shift把选项参数抹去,在例子中,对整个参数列表进行左移操作,最左边的参数就丢失了,位移的长度正好是刚才case循环完毕之后的OPTIND - 1,因为参数从1开始编号,选项处理完毕之后,正好指向剩余其它参数的第一个。