getopts没有提供任何参数

时间:2013-05-09 04:38:03

标签: bash getopts

如何检查是否没有提供必需的参数?我发现switch case中的“:”选项应该足以满足这个目的,但它永远不会进入那种情况(codeblock)。我是否在开头或其他地方放置“冒号”并不重要。

我的代码:

while getopts :a:b: OPTION;
do
     case "$OPTION" in
         a)
             var1=$OPTARG
             ;;
         b)
             var2=$OPTARG
             ;;
         ?)
             exitScript "`echo "Invalid option $OPTARG"`" "5"
             ;;
         :)
             exitScript "`echo "Option -$OPTARG requires an argument."`" "5"
             ;;
         *)
             exitScript "`echo "Option $OPTARG unrecognized."`" "5"
             ;;
     esac
done
提前THX。

2 个答案:

答案 0 :(得分:4)

您必须逃避?。下一步可以(部分)起作用。

err() { 1>&2 echo "$0: error $@"; return 1; }
while getopts ":a:b:" opt;
do
        case $opt in
                a) aarg="$OPTARG" ;;
                b) barg="$OPTARG" ;;
                :) err "Option -$OPTARG requires an argument." || exit 1 ;;
                \?) err "Invalid option: -$OPTARG" || exit 1 ;;
        esac
done

shift $((OPTIND-1))
echo "arg for a :$aarg:"
echo "arg for b :$barg:"
echo "unused parameters:$@:"

部分是因为何时将上述脚本称为

$ bash script -a a_arg -b b_arg extra

将按预期工作,

arg for a :a_arg:
arg for b :b_arg:
unused parameters:extra:

但是当你将其称为

bash script -a -b b_arg

将打印

arg for a :-b:
arg for b ::
unused parameters:b_arg:

什么不是,你想要什么。

和UUOE。 (Useles使用echo)。

答案 1 :(得分:2)

?)块中的

case应写为"?")