全力で怠けたい

怠けるために全力を尽くしたいブログ。

シェルの case でよく使うような気がするやつを軽くメモ。

シェルの case でよく使うような気がするやつを軽くメモしておく。

シェルの case でよく使うような気がするやつ

シェルは case を使うと Java とか Go の switch みたいなことができる。

シェルの case でよく使うような気がするやつを軽くメモしておく。

case の基本的な書き方

case の基本的な書き方を書いておく。

case は case で始めて esac で終わる。

case 文字列 in
    パターン1) 文字列がパターン1に合致するときのコマンド ;;
    パターン2) 文字列がパターン2に合致するときのコマンド ;;
    *) 文字列がどのパターンにも合致しないときのコマンド ;;
esac

こんな感じのシェルスクリプトを用意して実際に動かしてみる。

case $1 in
    hoge) echo 'Hello hoge!' ;;
    fuga) echo 'Hello fuga!' ;;
    *) echo 'Hello *' ;;
esac
$ ./my-case.sh hoge
Hello hoge!

$ ./my-case.sh fuga
Hello fuga!

$ ./my-case.sh piyo
Hello *

パターンは大文字と小文字を区別するので HOGE という文字列は hoge というパターンには合致しない。

$ ./my-case.sh HOGE
Hello *

パターンとパターンに合致するときのコマンドの間には改行を入れることができる。

case $1 in
    hoge)
        echo 'Hello hoge!' ;;
    fuga)
        echo 'Hello fuga!' ;;
    *)
        echo 'Hello *' ;;
esac

パターンに合致するときのコマンドは1つだけじゃなくて複数のコマンドが書ける。

case $1 in
    hoge)
        echo 'hello hoge!'
        echo 'hello hoge!'
        ;;
    fuga)
        echo 'hello fuga!'
        echo 'hello fuga!'
        ;;
    *)
        echo 'hello *'
        echo 'Hello *'
        ;;
esac

パターンに合致するときのコマンドが複数のコマンドのときは ; を使うとまとめて1行に書ける。

case $1 in
    hoge)
        echo 'hello hoge!' ; echo 'hello hoge!'
        ;;
    fuga)
        echo 'hello fuga!' ; echo 'hello fuga!'
        ;;
    *)
        echo 'hello *' ; echo 'Hello *'
        ;;
esac

一応、こんな感じに1行にまとめて書ける。

case $1 in
    hoge) echo 'hello hoge!' ; echo 'hello hoge!' ;;
    fuga) echo 'hello fuga!' ; echo 'hello fuga!' ;;
    *) echo 'hello *' ; echo 'Hello *' ;;
esac

?: 任意の1文字に合致

パターンは ? を使うと任意の1文字に合致する。

case $1 in
    a?) echo "a で始まる2文字" ;;
    *) echo "*" ;;
esac
$ ./my-case.sh aa
a で始まる2文字

$ ./my-case.sh ab
a で始まる2文字

$ ./my-case.sh a
*

$ ./my-case.sh abc
*

*: 任意の複数文字に合致

パターンは * を使うと任意の複数文字に合致する。

case $1 in
    a*a) echo "a で始って a で終わる文字列" ;;
    *) echo "*" ;;
esac
$ ./my-case.sh aba
a で始って a で終わる文字列

$ ./my-case.sh aa
a で始って a で終わる文字列

$ ./my-case.sh aaaaa
a で始って a で終わる文字列

$ ./my-case.sh a
*

[]: [] で囲んでいる任意の文字に合致

[] で文字を囲むと [] で囲んでいる任意の文字に合致する。

case $1 in
    [aA]*[aA]) echo "a か A で始って a か A で終わる文字列" ;;
    *) echo "*" ;;
esac
$ ./my-case.sh aa
a か A で始って a か A で終わる文字列

$ ./my-case.sh Aa
a か A で始って a か A で終わる文字列

$ ./my-case.sh aA
a か A で始って a か A で終わる文字列

$ ./my-case.sh AA
a か A で始って a か A で終わる文字列

[a-c] みたいに書くと a から c までの範囲の任意の文字に合致する。

case $1 in
    [a-c]*[a-c]) echo "a か b か c で始って a か b か c で終わる文字列" ;;
    *) echo "*" ;;
esac
$ ./my-case.sh ab
a か b か c で始って a か b か c で終わる文字列

$ ./my-case.sh bc
a か b か c で始って a か b か c で終わる文字列

$ ./my-case.sh ca
a か b か c で始って a か b か c で終わる文字列

[a-zA-Z] みたいに書くと任意のアルファベットに合致する。

case $1 in
    [a-zA-Z]*[a-zA-Z]) echo "アルファベットで始ってアルファベットで終わる文字列" ;;
    *) echo "*" ;;
esac
$ ./my-case.sh aZ
アルファベットで始ってアルファベットで終わる文字列

[!]: [] で囲んでいない任意の文字に合致

[!] で文字を囲むと [!] で囲んでいない任意の文字に合致する。

case $1 in
    [!a]*) echo "a 以外で始まる文字列" ;;
    *) echo "*" ;;
esac
$ ./my-case.sh b
a 以外で始まる文字列

$ ./my-case.sh ba
a 以外で始まる文字列

$ ./my-case.sh a
*

$ ./my-case.sh ab
*

[!a-c] みたいに書くと a から c までの範囲以外の任意の文字に合致する。

case $1 in
    [!a-c]*) echo "a と b と c 以外で始まる文字列" ;;
    *) echo "*" ;;
esac
$ ./my-case.sh a
*

$ ./my-case.sh b
*

$ ./my-case.sh c
*

$ ./my-case.sh d
a と b と c 以外で始まる文字列

|: 複数のパターンのいずれかに合致

abc|xyz みたいに書くと abcxyz のいずれかに合致する。

case $1 in
    abc|xyz) echo "abc か xyz" ;;
    *) echo "*" ;;
esac
$ ./my-case.sh abc
abc か xyz

$ ./my-case.sh xyz
abc か xyz

$ ./my-case.sh aaa
*

[ab]* みたいなパターンは | を使って a*|b* みたいに書くことができる。

case $1 in
    a*|b* ) echo "a か b で始まる文字列" ;;
    *) echo "*" ;;
esac

$ ./my-case.sh b
a か b で始まる文字列

$ ./my-case.sh ab
a か b で始まる文字列

$ ./my-case.sh bc
a か b で始まる文字列

$ ./my-case.sh ca
*