Unix-case-esac-statement

提供:Dev Guides
移動先:案内検索

Unix/Linuxシェル-case …​ esacステートメント

複数の if …​ elif ステートメントを使用して、多方向ブランチを実行できます。 ただし、これは、特にすべてのブランチが単一の変数の値に依存している場合は特に、常に最適なソリューションではありません。

シェルは、この状況を正確に処理する case …​ esac ステートメントをサポートし、if …​ elifステートメントを繰り返すよりも効率的です。

構文

*case ... esac* ステートメントの基本構文は、式の値に基づいていくつかの異なるステートメントを評価および実行する式を指定することです。

インタープリターは、一致が見つかるまで、式の値に対して各ケースをチェックします。 一致するものがない場合、デフォルトの条件が使用されます。

case word in
   pattern1)
      Statement(s) to be executed if pattern1 matches
      ;;
   pattern2)
      Statement(s) to be executed if pattern2 matches
      ;;
   pattern3)
      Statement(s) to be executed if pattern3 matches
      ;;
   *)
     Default condition to be executed
     ;;
esac

ここでは、一致するものが見つかるまで、文字列の単語がすべてのパターンと比較されます。 一致するパターンに続くステートメントが実行されます。 一致するものが見つからない場合、caseステートメントはアクションを実行せずに終了します。

パターンの最大数はありませんが、最小は1です。

ステートメント部分が実行されると、コマンド;;プログラムフローがcaseステートメント全体の最後にジャンプすることを示します。 これは、Cプログラミング言語のbreakと似ています。

#!/bin/sh

FRUIT="kiwi"

case "$FRUIT" in
   "apple") echo "Apple pie is quite tasty."
   ;;
   "banana") echo "I like banana nut bread."
   ;;
   "kiwi") echo "New Zealand is famous for kiwi."
   ;;
esac

実行すると、次の結果が表示されます-

New Zealand is famous for kiwi.

caseステートメントの良い使用法は、次のようにコマンドライン引数を評価することです-

#!/bin/sh

option="${1}"
case ${option} in
   -f) FILE="${2}"
      echo "File name is $FILE"
      ;;
   -d) DIR="${2}"
      echo "Dir name is $DIR"
      ;;
   *)
      echo "`basename ${0}`:usage: [-f file] | [-d directory]"
      exit 1 # Command to come out of the program with status 1
      ;;
esac

ここに上記のプログラムの実行例があります-

$./test.sh
test.sh: usage: [ -f filename ] | [ -d directory ]
$ ./test.sh -f index
$ vi test.sh
$ ./test.sh -f index
File name is index
$ ./test.sh -d unix
Dir name is unix
$