- intruduction
shell 脚本有二种方法定位脚本参数,一种是使用位置变量,二是使用getopts。使用位置参数有两个限制,他需要编程者自己测试错误并建立相应的消息。若使用shift处理参数,shift命令会删除掉所有的参数,如果你想在以后再次访问他们,将是不可能的。
getopts是built-in 命令,它可以方便地将命令行位置参数解析为选项并验证选项是否有效。
- getopts optstring name [args]
getopts引用的三个环境变量
OPTARG: 上一个由getopts内置命令处理的选项参数的值, option argument(存放选项参数),当选项需要选项参数时,getopts 命令就将其置于变量 OPTARG 中
OPTIND: 下一个由getopts内置命令处理的参数的序号,option index,每次调用脚本它都会被初始值为1,会逐次递增。
OPTERR: 如果设为1,bash会显示getopts的错误。设为0,不显示getopts的错误。
getopts 的处理过程
调用脚本时,OPTIND为初始化为1。每调用一次getopts,就将下一个选项值赋给name , 选项索引值OPTIND也会指向下一个要处理选项的位置,选项参数则会赋给OPTARG
getopts 的设计目标是在循环中运行,每执行一次,getopts就检查下一个命令行参数,并判断它是否有效。(即检查参数是否以-开头,后面跟一个包含在opstring中的字母)。
有效,则把匹配的选项字母存在指定的变量variable中,并返回退出状态0(ture);
无效(如果-后面的字母没有包含在options),就在 variable 中存入一个?,并返回退出状态0;如果命令行中已经没有参数,或者下一个参数不以-开头,就返回不为0的退出状态(false, 可用于结束while 循环)。
getopts处理完所有参数后,会返回一个非0值(false,退出循环),此时OPTIND索引值指向第一个非选项的参数[args],name置为?
getopts 错误处理
正确使用命令时,name用来存储option, $OPTARG用来存放option的参数。若命令输入有误(选项无效,缺少参数),getopts会处理illegal option错误和miss option argument错误。处理结果与opstring是否以:开头而不同。opstring 开头的:用于屏蔽getopts处理时的错误消息(脚本中将OPTERR置于0也可以达到同样的效果)。
使用下面的测试用例getopts.sh可以快速验证getopts如何处理错误
opstring 分别取值":ab:c:"和"ab:c:"
./getopts.sh -a -b ok -c no
./getopts.sh -a -b
./getopts.sh -w
脚本中通常使用? 捕获错误,name,OPTARG对待错误的取值可以用于自行定义错误消息的输出。
示例 opstring 错误类型 name OPTARG ./getopts.sh
-a -b":ab:c:" miss
option argument: b ./getopts.sh
-w":ab:c:" illegal options ? w ./getopts.sh
-a -b"ab:c:" miss
option argument? unset
OPTARG./getopts.sh
-w"ab:c:" illegal options ? unset OPTARG(取消变量) - 特殊说明
: ? 的特殊用途,故不作为选项字符来使用
getopts 允许把选项堆叠在一起(如 -ms)
opstring 包含一个可以放在一起选项字符串,若选项后带:,代表该选项调用里需要参数,调用这样的选项是不能与其它选项堆叠。
同一shell 环境多次执行getopts ,OPTIND不会被重置,重新调用参数时,必要时需手动重置OPTIND。
getopts 找到定义或未定义的选项时,都会返回0(true); 如果处理完参数,或者遇到错误,则返回非0值(false)
- eg
cat getopts.sh
#!/bin/bash
#===============================================================================
#
# FILE: getopts.sh
#
# USAGE: ./getops.sh
#
# DESCRIPTION_:
#
# OPTIONS: ---
# REQUIREMENTS: ---
# BUGS: ---
# NOTES: ---
# AUTHOR: Adelphos (), [email protected]
# COMPANY:
# VERSION: 1.0
# CREATED: 11/06/2014 04:15:10 AM EST
# REVISION: ---
#===============================================================================
while getopts "ab:c:" opt
do
case ${opt} in
a) echo -e " \r
opt:\t $opt
OPTIND: \t $OPTIND \r
OPTARG: \t$OPTARG \r
OPTERR: \t $OPTERR" ;;
b) echo -e " \r
opt:\t $opt
OPTIND: \t $OPTIND \r
OPTARG: \t$OPTARG \r
OPTERR: \t $OPTERR" ;;
c) echo -e " \r
opt:\t $opt
OPTIND: \t $OPTIND \r
OPTARG: \t$OPTARG \r
OPTERR: \t $OPTERR" ;;
?) echo "usage:"
echo -e"\t -a specify the installation path"
echo -e"\t -b specify the product type which you want to install, possible choiceis ESE,CONSV,CLENT"
echo -e "\t -c specify the installpackage"
echo-e " \r
opt:\t $opt
OPTIND: \t $OPTIND \r
OPTARG: \t$OPTARG \r
OPTERR: \t $OPTERR" ;;
esac
done