シェルスクリプト(bash)のif文を書く時、あれなんだっけと忘れることがよくあるので簡単にまとめてみました。
参考
大切なことはこちらに書いてあります
前提知識
- if文では条件式に指定されたコマンドの終了ステータスを判定し分岐をしている。終了ステータスが0の場合に真となり、そうでない場合には偽となる
-
if []
と書いた場合、if test
と書いたことと同じ扱い([]はtestコマンドの略式) -
[ "A" = "A" ]
というように[]の間にスペースがないとエラーとなる。例えば["A" = "A"]
とか書くとエラー。[がコマンドだと思うと理解しやすい - 条件式で<,>,<=,>=は使えない。代わりに-lt(<),-gt(>),-le(<=),-ge(>=)というのが使える。それぞれ-lt(less than),-gt(greater than),-le(less than or equal),-ge(greater than or equal)と覚える。でもわかりにくいので全部書いておきました。
- 困ったら
man test
で確認すればOK
コマンド集
文字列が等しいか
#!/bin/bash
hoge="A"
fuga="A"
if [ $hoge = $fuga ]; then
echo "文字列は同じです"
else
echo "文字列は違います"
fi
>を条件式に使いたい
-gt(greater than)を使う
#!/bin/bash
var1=1
var2=2
# >
if [ $var2 -gt $var1 ] ; then
echo "var2はvar1より大きい"
else
echo "var2はvar1以下"
fi
<を条件式に使いたい
-lt(less than)を使う
#!/bin/bash
var1=1
var2=2
# <
if [ $var1 -lt $var2 ] ; then
echo "var1はvar2より小さい"
else
echo "var1はvar2以上"
fi
>=を条件式に使いたい
-ge(greater than or equal)を使う
#!/bin/bash
var1=2
var2=2
# >=
if [ $var2 -ge $var1 ] ; then
echo "var2はvar1以上"
else
echo "var2はvar1より小さい"
fi
<=を条件式に使いたい
-le(less than equal)を使う
#!/bin/bash
var1=2
var2=2
# <=
if [ $var1 -le $var2 ] ; then
echo "var1はvar2以下"
else
echo "var1はvar2より大きい"
fi
ディレクトリの存在確認をしたい
-dオプションを使う。
#!/bin/bash
DIR="test"
if [ -d ${DIR} ]; then
echo "ディレクトリが存在します"
else
echo "ディレクトリが存在しません"
fi
ファイルの存在確認をしたい
-fオプションを使う
#!/bin/bash
LOCK_FILE="lock"
if [ -f ${LOCK_FILE} ]; then
echo "ファイルが存在します"
else
echo "ファイルが存在しません"
fi
シェルスクリプト内で実行したコマンドが正常終了したかを判定
コマンド実行後、$?
によって直前のコマンドの終了ステータスコードが取得できるので0(正常終了であるか)判定する
#!/bin/bash
curl http://www.google.co.jp >/dev/null 2>&1
if [ $? = 0 ]; then
echo "curlは正常終了"
else
echo "curlは異常終了"
fi
$?
は直前のコマンドの終了ステータスコードのみ保持しているので判定したいコマンドとif文の間で別のコマンドの実行をする場合には一度変数に$?の内容を保持しておく
NOT条件を使う
!オプションを使う。
#!/bin/bash
hoge=true
if [ ! $hoge ]; then
echo "こっちにはこない"
else
echo "こっちになる"
fi
AND条件、OR条件を使う
testコマンドの-a(AND条件)、-o(OR条件)で書けるが、&&(AND条件)、||(OR条件)の方が個人的には分かりやすい。
ただし、-a、-oは1つのtestコマンドで条件判定するのに対し、&&、||は終了ステータスコードを判断して以降の処理を実行するものなので書き方が少し違う点に注意。
-a、-oを利用する場合
#!/bin/bash
LOCK_FILE="lock"
DIR="dir"
if [ -f ${LOCK_FILE} -a -d ${DIR} ]; then
echo "ファイルとディレクトリが存在します"
else
echo "ファイルかディレクトリのいずれかが存在しません"
fi
&&、||を利用する場合
#!/bin/bash
LOCK_FILE="lock"
DIR="dir"
if [ -f ${LOCK_FILE} ] && [ -d ${DIR} ]; then
echo "ファイルとディレクトリが存在します"
else
echo "ファイルかディレクトリのいずれかが存在しません"
fi