まくまくLinux/Shellノート
Bash の構文: if-else による分岐処理
2007-05-08

if-else の基本

if による条件分岐は下記のように記述します。

if 条件
then
  処理
fi

thenif と同じ行に書いてあるスクリプトもよく見かけます。 Google もこのようなスタイルを採用しています。

if 条件; then
  処理
fi

処理内容が簡潔な場合は、下記のようにセミコロンを使用して一行で記述してしまうこともできます。

if 条件; then 処理; fi

複数の条件分岐を連ねる場合 (else if) は、下記のように elifelse を使って記述します。

if 条件1; then
  処理1
elif 条件2
  処理2
elif 条件3
  処理3
else
  処理4
fi

test コマンドによる比較処理

if の条件部では、test コマンドを使用して、数値比較や文字列比較を行うことができます。 実際には、test コマンドへのシンボリックリンクである、[ を使って記述するのが一般的です。 例えば、下記では数値比較を行うために test コマンドを使っていますが、

if test 1 -gt 0; then echo 'OK'; fi

これは次のように書くことができます。

if [ 1 -gt 0 ]; then echo 'OK'; fi

[ は単に test コマンドのエイリアスなので、[ の後ろには必ず 1 つ以上のスペースが必要です(上記では 1 が test コマンドへ渡すパラメータとして扱われています)。 [ で使用できる -eq-gt などのオプションは、man test とすれば調べることができます。

test コマンドの例

test コマンドのオプション指定により、様々な判定を行うことができます。

  • -z: 文字列の長さが 0 なら True
  • -f: 指定したファイルが存在するなら True

例: 環境変数 $HOGE が空かどうかを調べる

if [ -z "$HOGE" ]; then
  ...
fi

例: $HOME/.vimrc というファイルが存在するか調べる

if [ -f $HOME/.vimrc ]; then
  ...
fi

文字列を比較する

文字列変数の値を他の文字列と比較するときは、変数値にスペースが含まれているケースを考慮して、ダブルクォートで囲んで参照するようにします。

if [ "$str" = 'hoge' ]; then
  # match
fi

上記のように記述しておけば、$val に値がセットされていないときもエラーになりません。

&& を短絡演算子として使用する

if の条件部が真 (true) になるケースだけ簡単な処理を行いたい場合は、下記のように && を利用して if の代わりにすることができます。

echo "ごみ箱を空にしますか? [y/n]"
read input
[ "$input" = 'Y' -o "$input" = 'y' ] && rm ~/trash/*

上記は、下記のように記述したのと同様に振る舞います。

echo "ごみ箱を空にしますか? [y/n]"
read input
if [ "$input" = "Y" -o "$input" = "y" ]; then
  rm ~/trash/*
fi
2007-05-08