シェルのIF文による条件分岐

ifおよびtestコマンドは、処理の流れ(フロー)を制御するシェル構文です。指定した条件を満たした場合にのみ、特定のアクションを実行させることができます。

sh

条件を満たした場合にコマンドを実行する構文を次に示す。

if test condition
then
command
...
fi

testを省略して、条件をブラケットで囲む書き方もできる。

if [ condition ]
then
command
...
fi
condition

条件を指定する。この条件が真の場合にthenからfiまでのコマンドが実行される。

条件式の記述方法には、testシェルコマンドを使う方法と、その簡略記法である[]の2種類がある。

test condition
[ condition ]

いずれの構文も、条件を満たしたときは真(0)、条件を満たさないときは偽(1)と評価される。

条件式を満たさなかったときに真とするには、条件式 の前に否定演算子 ! を付ける。

test ! condition
[ ! condition ]
command

条件が真の場合に実行するコマンド

Unixのシェルは複数のコマンドをセミコロンで区切って1行で記述することができるので、上記の構文は下記のように記述することもできる。

if test condition; then
command; ...
fi
if [ condition ]; then
command; ...
fi

条件が偽の場合に実行するコマンドを指定することもできる。

if test condition
then
command
...
else
command
...
fi
if [ condition ]
then
command
...
else
command
...
fi

複数の条件で多分岐することもできる。

if test condition
then
command
...
elif test condition
command
...
else
command
...
fi
if [ condition ]
then
command
...
elif [ condition ]
command
...
else
command
...
fi

演算子

条件式に使用できる演算子を次に示す。

演算子 真になる条件
string1 = string2 文字列が等しい
string1 != string2 文字列が等しくない
-n string 文字列の長さが1以上
-z string 文字列の長さが0
number1 -eq number2 数値が等しい
number1 -ne number2 数値が等しくない
number1 -gt number2 数値number1number2より大きい
number1 -ge number2 数値number1number2より大きいか等しい
number1 -lt number2 数値number1number2より小さい
number1 -le number2 数値number1number2より小さいか等しい

演算子の使用例を次に示す。

if test $? -ne 0 ; echo $? ; fi
if test $? -gt 0 ; echo $? ; fi
if test $? -ge 1 ; echo $? ; fi

複数の条件をANDやORで組み合わせる

複数の条件式を論理積(AND)や論理和(OR)で組み合わせることもできます。複数の条件式を論理積(AND)で組み合わせる構文は次のとおりです。

test condition1 -a condition2
[ condition1 -a condition2 ]

複数の条件式を論理和(OR)で組み合わせる構文は次のとおりです。

test condition1 -o condition2
[ condition1 -o condition2 ]

if 文の例を次に示します。もし変数 var が定義されていれば、その変数の内容を表示する例です。

if test $var ; then echo $var ; fi

または次のように記述することもできます。

if [ $var ] ; then echo $var ; fi

ifthenfi の区切り文字はセミコロン記号です。シェルスクリプトで複数行にわたって記述する場合は、改行を行うことにより区切り文字を省略することができます。

if [ $var ]
then echo $var
fi

変数の値がある文字列と一致するかどうかをテストする例を次に示す。

if [ "$1" = "xxx" ]; then echo $1; fi

変数は二重引用符で囲む。下記の例のように変数を二重引用符で囲まない場合、変数に何らかの値が設定されていれば正常に動作するが、変数に値が設定されていないとエラーとなる。

if [ $1 = "xxx" ]; then echo $1; fi

ファイル演算子

条件式にはファイル演算子を使用することができます。ファイル演算子の一覧を次に示します。

-d path
指定されたディレクトリが存在する。(ファイルでない)

ディレクトリ /tmp/cache が存在しなければ作成するスクリプトの例を次に示します。

if [ ! -d /tmp/cache ]
then mkdir /tmp/cache
fi
-f path
指定したファイルが存在し、そのファイルが通常ファイルである。

スクリプトの第1引数に指定されたファイルが通常ファイルかどうかを表示する例を以下に示す。

if test -f $1
then echo $1 is normal file.
else echo $1 is not normal file.
fi

以下のように記述することもできる。

if [ -f $1 ]
then echo $1 is normal file.
else echo $1 is not normail file.
fi
-r path
指定したファイルが存在し、そのファイルが読み込み可能である。
if test -r $1
then echo $1 is readable.
else echo $1 is not readable.
fi
-s path
指定したファイルが存在し、そのサイズがゼロより大きい。
-w path
指定したファイルが存在し、そのファイルが書き込み可能である。
-x path
指定したファイルが存在し、そのファイルが実行可能である。
if test -x $1
then echo $1 is executable.
else echo $1 is not executable.
fi

bash

bash(Bourne Againシェル)のif構文はshと同じです。

bashでは、Bourneシェルのファイル演算子に加えて以下のファイル演算子を使用することができます。

-a path
ファイルが存在する
if test -a $1
then echo $1 exists.
else echo $1 does not exist.
fi
-e path
ファイルが存在する
if test -e $1
then echo $1 exists.
else echo $1 does not exist.
fi
-b path
ファイルが存在し、かつブロック型スペシャルファイルである
-c path
ファイルが存在し、かつキャラクタ型スペシャルファイルである
-g path
ファイルが存在し、かつ set-group-id である
-G path
ファイルが存在し、かつ実行グループIDで所有者である
-h path
ファイルが存在し、かつシンボリックリンクである
-k path
ファイルが存在し、かつスティッキビットがセットされている
-L path
ファイルが存在し、かつシンボリックリンクである
-N path
ファイルが存在し、かつ最後に読み出されたときから変更されている
-O path
ファイルが存在し、かつ実行ユーザIDで所有者である
-p path
ファイルが存在し、かつ名前つきパイプ (FIFO) である
-s path
ファイルが存在し、かつサイズが0より大きい
-S path
ファイルが存在し、かつソケットである
-t ファイル記述子
ファイル記述子で指定されたファイルがオープンされている
-u path
ファイルが存在し、かつ set-user-id ビットがセットされてる
-x path
ファイルが存在し、かつ実行可能である
if test -x $1
then echo $1 is executable.
else echo $1 is not executable.
fi