[shell] getopts使用

来源:互联网 发布:hadoop和云计算知乎 编辑:程序博客网 时间:2024/05/22 01:33
#!/bin/bash
# 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: $@"
                                                                               

0 0