shell之getopts

细则1:
当optstring以”:“开头时,getopts会区分invalid option错误和miss option argument错误,内置变量$OPTARG就是出问题的option
invalid option时,变量name会被设成?;
miss option argument时,变量name会被设成:;
如果optstring不以”:“开头,invalid option错误和miss option argument错误都会使varname被设成?。

细则2:
当optstring中的字母跟”:“时,表明该option可接参数,参数(argument)放在$OPTARG中
如果缺参数,且optstring是以”:“开头,则varname的值会是:,$OPTARG是该option。
否则varname的值是?,$OPTARG是该option.(参照细则1)

#!/bin/bash
if [[ $# -lt 1 ]];then
    echo "USAGE:`basename $0` [-a] [-b value] [-c]"
    exit 1
fi  
 
while getopts :ab:c name
do
    case $name in
        a)  aflag=1
        echo "a"
        ;;
        b)  bflag=1

        if [[ ${OPTARG:0:1} = "-" ]]; then
            echo "invalid parameter of $OPTARG"
            exit 1
        fi

        bval=$OPTARG
        ;;
        c)  cflag=1
        echo "c"
        ;;
        \?) echo "Invalid option :`basename $0` [-a] [-b value] [-c]"
        exit 1
        ;;
        :) echo "$0:Must supply an argument to -$OPTARG."
        exit 1
        ;;
    esac
done
echo $bval


注意

1.如果你执行脚本时,后面什么参数都不带时,则不会进入到循环

while getopts :ab:c name
所以还是需要通过以下代码来警告

if [[ $# -lt 1 ]];then
    echo "USAGE:`basename $0` [-a] [-b value] [-c]"
    exit 1
fi  

2.在getopts分析选项时,如果-b后面不带参数,直接跟-c的话,那么-c将作为-b的参数。

你可能感兴趣的:(c,shell,脚本)