在shell中,getopts用于解析命令选项和参数。getopts是Bash shell的内置命令,不支持长选项,仅解析短选项,即一个破折号("-")和一个字母或数字,如-1,-e, -E等。
getopts格式如下:
getopts OptString Name [Arg ...]
1.getopts命令后面的字符串如":a:c:Fg:"就是可以使用的选项列表即OptString,每个字符代表一个选项,后面带冒号(:)的意味着选项除了定义本身之外,还会带上一个参数作为选项的值。
2.每次调用getopts命令时,它都会查找OptString中定义的一个选项。如果找到,它会将此选项字符放入名为Name的变量中。如果选项与OptString中定义的选项不匹配,则getopts将变量Name设置为问号("?").如果该选项需要一个参数,getopts会获取该参数,并将其存放于$OPTARG中。如果未找到所需的参数,则变量Name将设置为冒号。
3.两个预先定义的变量:
(1).OPTARG:用来获取当前选项的参数值;
(2).OPTIND:代表当前选项在选项列表中的索引位置;当shell脚本启动时,OPTIND的值为1;处理一个开关型选项,OPTIND加1;处理一个带参数的选项,OPTIND会加2。
4.如果OptString中第一个字符是冒号,getopts使用静默错误报告(getopts uses silent error reporting),在此模式下,不会打印任何错误消息;如果第一个字符不是冒号,如果命令行中包含了没有在getopts列表中的选项,会有警告信息,类似illegal option -- x;
5.字符后面带冒号(:),表示该选项应该有一个参数,在命令行中用空格与其分开(或紧挨着);若字符后面没有冒号,表示不需要参数;
6.getopts处理父命令(parent command)的位置参数,在bash中,它存储在shell变量"$@"中。
7.两个破折号("--")的特殊选项被getopts解释为选项的结尾。
8.getopts设计为在脚本中多次运行,例如循环运行。它每次循环迭代处理一个选项。当没有更多选项需要处理时,getopts返回false,这会自动终止while循环。因此,getopts经常和while一起使用。
测试代码如下:
#! /bin/bash
author=""
addr_csdn=""
addr_github=""
echo "all parameters: $@"
OptString=":a:c:Fg:"
while getopts ${OptString} name; do
#while getopts "a:c:Fg:" name; do
case "$name" in
"a")
echo "option: $name, value is: $OPTARG, index is: $OPTIND"
author=$OPTARG ;;
"c")
echo "option: $name, value is: $OPTARG, index is: $OPTIND"
addr_csdn=$OPTARG ;;
"g")
echo "option: $name, value is: $OPTARG, index is: $OPTIND"
addr_github=$OPTARG ;;
"F")
echo "option: $name, shell script name: $0, index is: $OPTIND" ;;
":")
echo "Error: missing parameter value: ${OptString}, index is: $OPTIND"
exit 1 ;;
"?")
echo "Error: unknown option: ${OptString}, index is: $OPTIND"
exit 1 ;;
"*") # exit abnormally
echo "** abort **"
exit 1 ;;
esac
done
if [ ! -z ${author} ]; then
echo "author: ${author}"
fi
if [ ! -z ${addr_csdn} ]; then
echo "csdn addr: ${addr_csdn}"
fi
if [ ! -z ${addr_github} ]; then
echo "github addr: ${addr_github}"
fi
echo "processed parameters OPTIND: $OPTIND"
echo "remove processed parameters"
# shift is a bash built-in which kind of removes arguments from the beginning of the argument list
shift $((OPTIND-1))
echo "remaining parameters: $@"
echo "test finish"
在windows和linux上执行结果相同,如下:
GitHub:https://github.com/fengbingchun/Linux_Code_Test