シェルの 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 みたいに書くと abc と xyz のいずれかに合致する。
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
*