シェルの制御文(条件分岐)の if と case についてです。
if文について
基本構文
if文の基本的な構文は次のようになります。JavaとかRubyの場合は then を省略できますがシェルの場合は必須です。else を省略することはできます。
if command-list then 処理文1 # command-listの結果(終了コード)が0の時に実行される else 処理文2 # command-listの結果(終了コード)が0以外の時に実行される fi
elif を使って複数の条件を追加していくことも可能です。
if command-list1 then 処理文1 # command-listの結果(終了コード)が0の時に実行される elif command-list2 then 処理文2 # command-list1の結果が0以外で、command-list2の結果が0の時に実行される else 処理文3 # command-list1とcommand-list2の結果が0以外の時に実行される fi
if文の使い方
シェルのif文は if と then の間に記述するコマンドの終了コードで結果を判断します。よく使われるのが test コマンドです。
if test -f <file-name> then 処理文 fi
test コマンドはある条件を判定し、その条件が正しい場合には 0 の値を返し、誤ってる場合には 0 以外の値を返します。上記の例ではファイルが存在するかどうかを判定しています。
また、シェルで使う test コマンドは次のように鉤括弧を使って書かれる事がほとんどです。鉤括弧と条件の間にはスペースを空ける必要があります。
if [ -f <file-name> ] then 処理文 fi
then の位置をif と同じ行に書く事も多いですがその場合はセミコロンが必要です。セミコロンがあることによって明示的に行の終了を示しています。
if [ -f <file-name> ]; then 処理文 fi
testコマンド以外を使用する
if文は終了コードで結果を判断するため、次のように他のシェルを呼び出して返り値で判断することも出来ます。
# test.sh if . error.sh; then echo "error.shの終了コード0です。" else echo "error.shの終了コード0以外です。結果:$?" fi
# error.sh return 99
実行結果です。
$ sh test.sh 終了コード0以外です。結果:99
case文について
基本構文
case文の基本的な構文は次のようになります。指定した値に合致したパターンの処理をセミコロンが2つ( ;; )書かれているところまで実行してくれます。
case <string> in pattern1) 処理文1 ;; pattern2) 処理文2 ;; pattern3) 処理文3 ;; esac
case文の使い方
もし複数のパターンに合致するような条件の場合は最初に合致した処理を実行して終了しますので、パターンの並べ方には注意しましょう。
# test.sh case $1 in *Mac*) echo "あなたのPCはMacです。" ;; # ワイルドカードを指定。Macという文字が引数に指定されたら合致する。 iMac) echo "あなたのPCはiMacです。" ;; # iMacという文字が引数に指定されたら合致する。 Win*) echo "あなたのPCはWindowsです。" esac
$ sh test.sh iMac あなたのPCはMacです。 # iMacを引数にしたが1つ目のパターンに合致してしまうので、2つ目のパターンは実行されない。
指定したパターンどれにも合致しなかった場合の処理を入れる場合はワイルドカード( * )を使います。アスタリスクのみの場合は全てに合致しますので、最後に置くことでどれにも合致しなかった場合でも処理を実行してくれます。
# test.sh case $1 in *Mac*) echo "あなたのPCはMacです。" ;; iMac) echo "あなたのPCはiMacです。" ;; Win*) echo "あなたのPCはWindowsです。" ;; *) echo "あなたのPCは$1です。" ;; esac
$ sh test.sh ChromeBook
あなたのPCはChromeBookです。
パターンには必ずしも処理を記述しなくても大丈夫です。何もしないということになります。ただし、セミコロン( ;; )は省略できません。
case $1 in *Mac*) echo "あなたのPCはMacです。" ;; iMac) echo "あなたのPCはiMacです。" ;; Win*) ;; *) echo "あなたのPCは$1です。" ;; esac
参考書籍
ソフトバンククリエイティブ
売り上げランキング: 95,987