シェルの条件分岐の使い方について (ifとcase)

スポンサーリンク

シェルの制御文(条件分岐)の 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

参考書籍

入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界
ブルース ブリン
ソフトバンククリエイティブ
売り上げランキング: 95,987