2016-07-08 4 views
3

オプションを使用して変数を操作するスクリプトを作成しようとしていますが、オプションが指定されていない場合はショートカットがあります。したがって、例えば、私はaddshowset、及びdeleteを持っているが、私はそれらのいずれかを指定しない場合は、入力を行うためにどの動作を決定するために解釈される:bash:case文では、他の場合に移動します

  • script keyscript show keyのショートカットであります
  • script key=value
  • は、私はオプションのため case文を書かれてい script set key=value

のショートカットですが、キャッチオールでは、「ケースXに行く」と言うことが可能である?:

case $1 in 
    add) 
     #blah;; 
    show) 
     #blah;; 
    set) 
     #blah;; 
    delete) 
     #blah;; 
    *) 
     if [[ $1 == *=* ]]; then 
      #go to case "set" 
     elif [[ $1 ]]; then 
      ##go to case "show" 
     else 
      echo "FAILURE!!!" 
      exit 1 
     fi 
    esac 

EDIT

は私が思い付いた:ほとんど動作しますが、今

case $1 in 
    add) 
     #blah;; 
    delete) 
     #blah;; 
    set|*=*) 
     #blah;; 
    show|*) 
     #blah;; 
    esac 

(何の最後の引数がない場合、すなわち私はちょうどscriptを実行する)それはscript showを実行しようとします。

+1

申し訳ありませんが、私は –

+2

:-)あなたupateが '' *空の文字列に一致する表示されません。 '?*'はできません。 – chepner

+0

caseを 'show |?*)に変更すると、標準の' *) 'catchallを使って単一の' case'ステートメントとして保持できますか?すなわち[this](http://pastebin.com/jKXDzu1s) – ewok

答えて

4

私はこのようなあなたのコードを構造化することをお勧め。

+0

などがあります。好奇心から、if [[-z $ 1]]と[if $ [-lt 2]]の間に違いがありますか? – ewok

+3

'$ 1'は明示的に空文字列にすることができます:' somecommand '"a b c d e f g h i'。ここで '$ 1'は空ですが、' $# 'は2よりはるかに大きいです。 – chepner

+0

@ewok chepnerは言ったことがあります! ;) –

-2

試してみてください。

if [[ -z $1 ]]; then 
    echo "FAILURE!!!" 
    exit 1 
fi 

case $1 in 
    add) 
     #blah;; 
    set|*=*) 
     #blah;; 
    delete) 
     #blah;; 
    show|*) 
     #blah;; 
esac 

すなわちcase文を押す前に失敗し、各ケースのパターンを組み合わせること|を使用します。

case $1 in 
    add) 
     #blah;; 
    show|*) 
     #blah;; 
    set|*=*) 
     #blah;; 
    delete) 
     #blah;; 
    *) 
     echo "FAILURE!!!" 
     exit 1 
    esac 
+1

'add |'以外の '$ 1'の値はあなたの' show | *) 'ブランチに入ります。言い換えれば、残りのすべてのブランチには決して到達しない。 – mklement0

2

あなたは$1が供給されていない場合、スクリプトを失敗するcaseの開始時に"${1?arg needed}"の代わり$1を使用することができます。

case "${1?arg needed}" in 
    add) 
     echo "add";; 
    delete) 
     echo "delete";; 
    set|*=*) 
     echo "set";; 
    show|*) 
     echo "show";; 
esac 

テストこの:

bash ./script 
-bash: 1: arg needed 

bash ./script foobar 
show 

bash ./script abc=123 
set 
関連する問題