2013-05-09 109 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

相關問題