CASE 文

Bashスクリプト入門

Alex Scriven

Data Scientist

CASE 文が必要な理由

複数・複雑な条件では、CASE 文は IF 文より効率的な場合があります。

次の条件と処理を想定します。

  • ファイルに sydney があれば /sydney ディレクトリへ移動
  • melbourne または brisbane があれば削除
  • canberra があれば、元の filename を使い IMPORTANT_filename に改名
Bashスクリプト入門

複雑な IF 文

複数の IF 文で次のようにも書けます:

  • 条件判定で最初の ARGV 引数に対して grep を呼びます。
if grep -q 'sydney' $1; then
    mv $1 sydney/
fi
if grep -q 'melbourne|brisbane' $1; then
    rm $1
fi
if grep -q 'canberra' $1; then
    mv $1 "IMPORTANT_$1"
fi
  • 複雑で重複が多いですね。
Bashスクリプト入門

CASE 文を組み立てる

  • まず、どの変数や文字列にマッチさせるかを選びます
    • ここでシェルの入れ子呼び出しも可能です
  • マッチと処理は必要なだけ追加できます
    • PATTERN には正規表現を使えます。例: 先頭が Air は Air*、hat を含むは *hat*。
  • パターンと実行コードは閉じ括弧で区切り、コマンドは二重セミコロンで終了します

CASE 文の基本構造:

case 'STRINGVAR' in

PATTERN1) COMMAND1;; PATTERN2) COMMAND2;;
Bashスクリプト入門

CASE 文を組み立てる

 

  • *) DEFAULT COMMAND;;

    • どれにも一致しない場合に実行するデフォルトを最後に置くのが一般的です(必須ではありません)。
  • esac 最後は 'esac' で閉じます

    • 'case' を逆綴りにしたものです。

CASE 文の基本構造:

case 'STRING' in
  PATTERN1)
  COMMAND1;;
  PATTERN2)
  COMMAND2;;

*) DEFAULT COMMAND;;
esac
Bashスクリプト入門

IF から CASE へ

以前の IF 文:

if grep -q 'sydney' $1; then
    mv $1 sydney/
fi

if grep -q 'melbourne|brisbane' $1; then
    rm $1
fi

if grep -q 'canberra' $1; then
    mv $1 "IMPORTANT_$1"
fi

新しい CASE 文:

case $(cat $1) in

*sydney*) mv $1 sydney/ ;; *melbourne*|*brisbane*) rm $1 ;; *canberra*) mv $1 "IMPORTANT_$1" ;;
*) echo "No cities found" ;; esac
Bashスクリプト入門

Let's practice!

Bashスクリプト入門

Preparing Video For Download...