2014-01-15 39 views
0

我想對我正在編寫的bash腳本進行一些錯誤檢查。特別是,我希望確保以下選項不被視爲選項(有意)保留爲空的參數。避免將選項自動作爲參數

比方說,下面的代碼片段

while getopts 「hhelpc1:2:」 OPTION 
do 
    case "$OPTION" in 
     h|help) 
      usage 
      exit 1 
      ;; 
     1) 
      var1=${OPTARG} 
      ;; 
     2) 
      var2=${OPTARG} 
      ;; 
     c) 
      test1 
      ;; 
    esac 
done 

假設我的劇本被稱爲test.sh

通過做這樣的事情

./test.sh -1 -2 dddd -c 

在上述情況下test1的輸出的錯誤消息 - 2選項爲空。相反,我想提出-1爲空的警告,而目前-2將作爲-1的參數。

任何幫助?

感謝 安德烈

回答

1

getopts

  1. 只處理短選項名稱,所以你不能把「幫助」中的選項字符串 - 這意味着你要尋找的「-h」 「-e」,「-l」,「-p」
  2. 不能以您希望的方式尋找缺失的參數。你必須檢查$ OPTARG來檢查它是否看起來像你的一個選項。

添加一個領先的:到opt字符串來自己處理getopts錯誤。

這是你的代碼的改造,我相信有很多的情況下,我沒抓

#!/bin/bash 

usage() { echo usage ...; } 
test1() { echo test1; } 

shopt -s extglob 

while getopts ":hc1:2:" opt 
do 
    case $opt in 
     h) 
      usage 
      exit 1 
      ;; 
     1) 
      case $OPTARG in 
       -[hc2]*) 
        echo "error: required argument missing for -1" 
        usage 
        exit 1 
        ;; 
       *) var1=$OPTARG 
        ;; 
      esac 
      ;; 
     2) 
      case $OPTARG in 
       -[hc1]*) 
        echo "error: required argument missing for -2" 
        usage 
        exit 1 
        ;; 
       *) var2=$OPTARG 
        ;; 
      esac 
      ;; 
     c) 
      test1 
      ;; 
     :) 
      echo "error: required argument missing for -$OPTARG" 
      usage 
      exit 1 
      ;; 
     \?) 
      # unknown argument, handle accordingly 
      ;; 
    esac 
done 
shift $((OPTIND - 1)) 

echo "var1=$var1" 
echo "var2=$var2" 
echo "rest=$*" 

更新2014年1月23日

這裏有一個技巧:

do_test1=false 

while getopts ... 
    case $opt in 
     ... 
     c) do_test1=true ;; 
     ... 
    esac 
done 
shift $((OPTIND - 1)) 

# execute function "test1" if "-c" was given: 
$do_test1 && test1 
+0

嘿格倫。你很棒。感謝這一塊代碼。我會審查它。我立即發現的情況就是這種情況 - 對於選項1,[hc1]不應該是 - [hc2]。如果沒有,那麼我不明白。 –

+0

你說得對。固定。 –

+0

嗨格倫,還有一個問題。有沒有辦法在執行功能位之前解析所有參數?考慮到上面的例子,假設我有一個./script.sh -c -1 aa -2 bb,以-c作爲第一個參數將在所有其餘行被讀取之前觸發測試函數。當然,如果參數丟失,測試可以防止執行,但只要讀取-1和-2,就不會再出現這種情況。這裏有什麼提示嗎? –