シェルの 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
みたいに書くと 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 *