書式
switch VALUE; [case [WILDCARD...]; [COMMANDS...]; ...] end

概要

switch コマンドは
複数の COMMANDS の1つを、
VALUEWILDCARD にマッチするかどうか
判断して実行します。

case コマンドは、どのブロックが
実行されるのかを決定するために
switch とともに使われます。

case コマンドは
1つ以上のパラメータが与えられます。

VALUE にマッチするパラメータが与えられた
最初の case コマンドに対応する COMMANDS
評価されます。

case のパラメータには
ワイルドカードを含められます。

ワイルドカードは
ファイル名に使われる
通常のワイルドカード展開を防ぐために、

エスケープされるか
クオートされる必要があります。(例参照)

注意

  • 訳注:fishの switch では else は使えない。
    代わりに case '*' を使う。
  • fishは(訳注:C言語などとは異なり)
    case コマンドをfall throughしない。
    最初にマッチした case のみが実行される。
  • case 内の コマンド置換
    対応する COMMANDS
    与えられていなくても評価される。

    VALUE は、全置換完了後の case
    パラメータと比較される。
    (コマンド置換も含む)

訳注:
ちょっと分かりにくいので、
例を後述します。

実行例

変数 $animal
動物名が設定されているとき、
以下のコードは分類しようとします。

case には複数のパラメータを
置くことができます。

function classify_animal
        echo $animal
        switch $animal
                case cat
                        echo evil
                case wolf dog human moose dolphin whale
                        echo mammal
                case duck goose albatross
                        echo bird
                case shark trout stingray
                        echo fish
                case '*'
                        echo I have no idea what a $animal is
        end
end

# 上記の関数を定義した状態で実行すると…
$ set animal whale; classify_animal
whale
mammal
$ set animal cat; classify_animal
cat
evil
$ set animal goose; classify_animal
goose
bird
$ set animal stingray; classify_animal
stingray
fish
$ set animal ant; classify_animal
ant
I have no idea what a ant is

fall throughとは、
C系のプログラミング言語において

break で明示的に switch から
抜けることを指示しないと、
次の case も実行してしまうことです。

また、fishの switch
最初にマッチしたもののみを
実行します。

以下の例では
どの case も満たしますが
最初にマッチした1、3を表示します。

set foo nyanya
switch $foo
        case nyanya
                echo 1          #
        case 'n*'
                echo 2
end

switch $foo
        case 'n*'
                echo 3          # 
        case nyanya
                echo 4
end

以下は case 内の
コマンド置換+ 変数展開 の例です。

(echo fi)fi になり、
$shsh になり、

その結果、置換後の case のパラメータは
fish になります。

実行すると
okと表示されます。

set shell fish
set sh sh
switch $shell
        case (echo fi)$sh
                echo ok
end

最後までお読みいただき、ありがとうございました。参考になれば嬉しいです。