2013-05-21 251 views
11

我正在努力學習案例,因爲我正在編寫一個功能齊全的腳本。Bash案例陳述

我開始了與下面

#!/bin/sh 
case [email protected] in 

    -h|--help) 
      echo "You have selected Help" 
      ;; 
    -B|-b) 
      echo "You have selected B" 
      ;; 
    -C|-c) 
      echo "You have selected C" 
      ;; 
     *) 
      echo "Valid Choices are A,B,C" 
      exit 1 
      ;; 
esac 

我想用兩個選項:

./getopts.sh -h -c 

,但我得到這個結果 有效的選擇是A,B,C

請你幫忙,讓我知道我做錯了什麼?

我想要建立一個腳本,如果你輸入一個選項,它會做某些事情,但如果你輸入多個選項,你可以做很多事情。

另外,我將如何解析$ 1到這個腳本作爲surley哪個選項我第一次輸入(-h)將是$ 1?

謝謝!

+0

你爲什麼不使用'getopts',而不是'case'? – fedorqui

+0

我對任何想法都很開放,因爲我還沒有真正使用過。我需要學習這個,而不是擁有1000個嵌套的if語句 – bsmoo

+0

@fedorqui即使使用getopts,仍然需要一個循環(通常是一個'while循環)和某種案例分析,'case'比if更好...... elif ......就是爲了這個目的。 – Uwe

回答

11

試試這個

#!/bin/sh 

usage() { 
    echo `basename $0`: ERROR: $* 1>&2 
    echo usage: `basename $0` '[-a] [-b] [-c] 
     [file ...]' 1>&2 
    exit 1 
} 


while : 
do 
    case "$1" in 
    -a|-A) echo you picked A;; 
    -b|-B) echo you picked B;; 
    -c|-C) echo you picked C;; 
    -*) usage "bad argument $1";; 
    *) break;; 
    esac 
    shift 
done 
+0

好吧,看起來不錯。如果我想要一個更加棘手的問題 - 做'whois $ 1'我將如何完成這項工作我希望使用類似'./script.sh -a example.com'或'./script.sh -a - b example.com對此有何看法? – bsmoo

+0

請查看http://www.grymoire.com/Unix/Sh.html#uh-96中的-o選項 –

6

使用getoptgetopts是更好的解決方案。但要回答您的直接問題,[email protected]全部爲,因此-h -c與您的case語句中的任何單一參數模式都不匹配。你仍然需要遍歷你的論點,像這樣

for arg in "[email protected]"; do 
    case $arg in 
     .... 
    esac 
done 
+3

FWIW:'對於「$ @」中的arg; do ...'等同於'for arg;做...' –

0

解析位置參數像... $ 1,只是在案件語句使用$ 1,然後在最後...用途轉移到休閒區的第二參數爲1美元,同樣如此。

還我會把情況下,語句在while循環或更好的FXN,這樣我可以兩個選項或選項的數目的兩倍運行..........

$ #會讓你知道有多少選項/參數。