# Usage: ./getopts.sh -d 3 -f file a b c d
# $0 :命令本身,相当于C/C++中的argv[0]
# $1 :第一个参数.$2,$3,... :类推。
# $# 参数的个数,不包括命令本身
# $@ :参数本身的列表,不包括命令
# $* :和$@相同,但"$*"将所有的参数解释成一个字符串,而"$@"是一个参数数组。
# OPTARG存储相应选项的参数 OPTIND指向的是下一个参数的index
# shift 会改变参数的顺序,通过左移去掉某些参数
# getopts 检测到非法参数就会停止
# 当optstring以":"开头时,getopts会区分invalid option错误和miss option argument。
# invalid option错误时,varname会被设成?
# miss option argument时,varname会被设成:
# 选项参数识别完成之后,对剩余的其它命令行参数,可以使用shift把选项参数抹去,对整个参数列表进行左移操作,
# 位移的长度是case循环完毕之后的OPTIND - 1,因为参数从1开始编号,选项处理完毕之后,指向剩余其它参数的第一个。
# unset OPTIND 可以解决shell脚本的函数中使用getopts
# 对于.bashrc之类,可用local OPTIND
usage()
{
echo -e "Usage: `basename $0` [-d DIGIT] [-f FILE]\n\
-d Specify which distro these apps are built against\n\
-f Input file which contains the applications' dependences"
exit 1
}
if [[ $# -lt 1 ]];then
usage
fi
while getopts ":Dd:f:" arg
do
case $arg in
D)
echo "D"
;;
d)
echo "d" $OPTIND "$OPTARG"
if [[ ${OPTARG:0:1} = "-" ]]; then
echo "$OPTARG is invalid arg for $arg"
exit 1
fi
;;
f)
echo "f" $OPTIND "$OPTARG"
if [[ ${OPTARG:0:1} = "-" ]]; then
echo "$OPTARG is invalid arg for $arg"
exit 1
fi
;;
\?) echo "Invalid option"
usage
exit 1
;;
:) echo "Must supply an argument to -$OPTARG."
exit 1
;;
esac
done
echo 处理完参数后的 OPTIND:$OPTIND
echo $0
echo $1
echo $*
shift $(($OPTIND - 1))
echo 左移之后参数索引位置:$OPTIND
echo $0
echo $1
echo $*
echo "Other Params: $@"