功能
功能主要是用来处理命令行选项和参数。
它的优势在于:
- 不需要通过外部程序来处理位置参数
- 可以很容易的设置你可以用来解析Shell的变量
- 定义在POSIX
通常情况下,在处理命令行参数是需用用到循环,多次调用getopts。当没有内容可解析的时候,getopts会设置一个退出状态FALSE。
getopts用到的变量
- OPTIND:
- 存放一个要处理的参数的索引
- OPTARG:
- 这个变量被设置为由getopts找到的选项的参数
- OPTERR:
- 它的值为0或1.指示Bash是否应该显示由getopts产生的错误信息
基本的语法:
getopts OPTSTRING VARNAME [ARGS...]
- OPTSTRING:
- 告诉getopts会有哪些选项和哪会有参数(用选项后加”:”表示)
- VARNAME:
- 告诉getopts哪个变量用于选项报告
*ARGS: - 告诉getopts解析这些可选的参数,而不是参数位置
- 告诉getopts哪个变量用于选项报告
Example
getopts fA:x VARNAME
#告诉getopts查找-f,-A,-x选项,-A选项后面会有一个参数
错误报告模式
详细错误报告模式
在详细错误报告模式下,getopts遇到一个无效的选项,VARNAME的值会被设置为”?”,并且变量OPTARGS不会被设置;如果遇到一个参数没有找到,VARNAME的值同样会被设置为”?”,变量OPTARGS不会被设置,并且会打印一个错误信息。
抑制错误报告模式
在抑制错误报告模式下,getopts遇到一个无效的选项,VARNAME的值会被设置为”?”,并且变量OPTARGS会被设置为选项字符;如果遇到一个参数没有找到,VARNAME的值同样会被设置为”:”,变量OPTARGS中会包含选项字符。
实例
#!/bin/bash
vflag=off
filename=""
output=""
function usage(){
echo "USAGE"
echo "myscript [-h] [-v] [-f <filename>] [-o <filename>]"
exit -1
}
while getopts :hvf:o: opt
do
case "$opt" in
v)
vflag=on
;;
f)
if [ ! -f $filename ]
then
echo "The source file $filename doesn't exist!"
exit
fi
;;
o)
if [ ! -d $output ]
then
echo "The output path 'dirname $output doesn't exist"
exit
fi
;;
h)
usage
exit
;;
:)
echo "The option -$OPTARG requires an argument"
exit 1
;;
?)
echo "Invalid option: -$OPTARG"
usage
;;
esac
done
运行结果
bigship@bigship-virtual-machine:~/shell_learning/shift$ ./getopts2 -h
USAGE
myscript [-h] [-v] [-f <filename>] [-o <filename>]
bigship@bigship-virtual-machine:~/shell_learning/shift$ ./getopts2 -vf
The option -f requires an argument
bigship@bigship-virtual-machine:~/shell_learning/shift$ ./getopts2 -vf /etc/passwd -o /tmp/output.log
bigship@bigship-virtual-machine:~/shell_learning/shift$