2013-05-09 77 views
2

如何检查是否没有提供所需的参数?我发现switch case中的“:”选项应该足够用于此目的,但它永远不会输入该情况(codeblock)。我是否在开始或其他地方放置“冒号”是无关紧要的。getopts没有提供参数

我的代码:

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提前。

+1

首先,尝试总是提供最小工作示例:你的不是因为'exitScript'函数。 – 2013-05-09 04:54:23

回答

4

你必须逃过?。下一个可以(部分)工作。

err() { 1>&2 echo "$0: error [email protected]"; 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:[email protected]:" 

部分,因为当将调用上面的脚本

如您所愿
$ 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使用回声)。

2

?)case块应写为"?")

+1

+1为了说明起见,'case'选择符中没有引号的'?'是一个glob模式,它匹配任何单个字符 - 这里截取了一个':'的值,并且永远不会到达为其指定的子句。 – michaelb958 2013-05-09 04:49:21

相关问题