2015-05-24 70 views
0

如何標記bash腳本中的錯誤,該錯誤需要使用getopt參數 ,但用戶沒有通過它?例如下面 腳本需要的選項「T」的說法:Bash - 可選參數是必需的,但未通過用於getopts

#!/bin/bash 
while getopts "ht:" OPTION 
do 
    case $OPTION in 
     h) 
      echo "Hi" 
      ;; 
     t) 
      echo You entered $OPTARG 
      ;; 
    esac 
done 

我要趕下面的錯誤和打印別的東西 退出。目前,它繼續評估更多的參數,而沒有 退出。

$ ./x.sh -h -t aa  # (this is fine) 
Hi 
You entered aa 

$ ./x.sh -h -t  # (this is not handled) 
Hi 
No arg for -t option  # (this error is being printed by bash) 

回答

2

幾點這裏:

# Note the leading ':' 
while getopts :ht: OPTION 
do 
    case $OPTION in 
     h) 
      echo "Hi" 
      ;; 
     t) 
      echo "You entered $OPTARG" 
      if [[ ${OPTARG:0:1} == '-' ]]; then 
       echo "Invalid value $OPTARG given to -$OPTION" >&2 
       exit 1 
      fi 
      ;; 
     :) echo "$0: -$OPTARG needs a value" >&2; 
      exit 2 
      ;; 
     \?) echo "$0: unknown option -$OPTARG" >&2; 
      exit 3 
      ;; 
    esac 
done 

領先「:」選項列表中允許我們做我們自己的錯誤處理。如果提供未知選項,則OPTION設置爲?。請注意,在case聲明中,必須轉義(前綴爲\),否則它將匹配任何單個字符。

如果未向選項提供值,則OPTION設置爲:

./x -t -h 

因爲-h將被當作OPTARG到選項-t:不幸的是,如果有人做這沒有幫助。因此,額外的測試。

請注意,所有錯誤消息都會發生標準錯誤(>&2)。要停止腳本的執行,我們使用exit,後跟一個0-255範圍內的數字。唯一具有特定含義的數字是零,這意味着成功。數字1-255可以有我們選擇的任何含義,但都意味着失敗。

使用你的例子:

./x.sh -t -h 
You entered -h 
Invalid value -h given to -t 

./x.sh -h -t aa 
Hi 
You entered aa 

./x.sh -h -t 
Hi 
./x.sh: -t needs a value 

./x.sh -t tea -c 
You entered tea 
./x.sh: unknown option -c 
+0

優秀的答案,它回答我想問下的東西。非常感謝,感謝您的幫助。 – user2511788

2

當它得到一個失敗,getopts套OPTION一個問號(?)。您應該將其添加到您的病例陳述中。如前所述,這是一個外殼符號,需要轉義。

getoptsbash的內置功能。除了檢查明確的?字符外,還可以使用bash變量OPTERR,如Using getopts in bash shell script to get long and short command line options中所述。

查找此信息的最佳位置是bash的文檔。奇怪的是(給定bash中的分機號碼),它在標題爲4.1 Bourne Shell Builtins的部分,實際上有一個POSIX getopts作爲參考。然而,OPTERR變量是bash extension

+0

感謝這些鏈接和幫助。 – user2511788