ifおよびtestコマンドは、処理の流れ(フロー)を制御するシェル構文です。指定した条件を満たした場合にのみ、特定のアクションを実行させることができます。
条件を満たした場合にコマンドを実行する構文を次に示す。
if test condition
then
command
...
fi
testを省略して、条件をブラケットで囲む書き方もできる。
if [ condition ]
then
command
...
fi
条件を指定する。この条件が真の場合にthenからfiまでのコマンドが実行される。
条件式の記述方法には、testシェルコマンドを使う方法と、その簡略記法である[]の2種類がある。
test condition
[ condition ]
いずれの構文も、条件を満たしたときは真(0)、条件を満たさないときは偽(1)と評価される。
条件式を満たさなかったときに真とするには、条件式 の前に否定演算子 ! を付ける。
test ! condition
[ ! condition ]
条件が真の場合に実行するコマンド
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 | 数値number1がnumber2より大きい |
number1 -ge number2 | 数値number1がnumber2より大きいか等しい |
number1 -lt number2 | 数値number1がnumber2より小さい |
number1 -le number2 | 数値number1がnumber2より小さいか等しい |
演算子の使用例を次に示す。
if test $? -ne 0 ; echo $? ; fi
if test $? -gt 0 ; echo $? ; fi
if test $? -ge 1 ; echo $? ; fi
複数の条件式を論理積(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
if
と then
と fi
の区切り文字はセミコロン記号です。シェルスクリプトで複数行にわたって記述する場合は、改行を行うことにより区切り文字を省略することができます。
if [ $var ]
then echo $var
fi
変数の値がある文字列と一致するかどうかをテストする例を次に示す。
if [ "$1" = "xxx" ]; then echo $1; fi
変数は二重引用符で囲む。下記の例のように変数を二重引用符で囲まない場合、変数に何らかの値が設定されていれば正常に動作するが、変数に値が設定されていないとエラーとなる。
if [ $1 = "xxx" ]; then echo $1; fi
条件式にはファイル演算子を使用することができます。ファイル演算子の一覧を次に示します。
ディレクトリ /tmp/cache
が存在しなければ作成するスクリプトの例を次に示します。
if [ ! -d /tmp/cache ]
then mkdir /tmp/cache
fi
スクリプトの第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
if test -r $1
then echo $1 is readable.
else echo $1 is not readable.
fi
if test -x $1
then echo $1 is executable.
else echo $1 is not executable.
fi
bash(Bourne Againシェル)のif構文はshと同じです。
bashでは、Bourneシェルのファイル演算子に加えて以下のファイル演算子を使用することができます。
if test -a $1
then echo $1 exists.
else echo $1 does not exist.
fi
if test -e $1
then echo $1 exists.
else echo $1 does not exist.
fi
if test -x $1
then echo $1 is executable.
else echo $1 is not executable.
fi