言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

  1. トップページ
  2. Bash辞典
  3. if / elif / else

if / elif / else

『if』文はコマンドの終了ステータスを評価して処理を分岐します。条件式には『[ ]』『[[ ]]』のほか、通常のコマンドも使えます。『elif』で多段分岐、『else』でそれ以外の処理を書きます。

構文

基本構文です。

if コマンドまたは条件式; then
    処理
elif コマンドまたは条件式; then
    処理
else
    処理
fi

[ ] を使う場合です(test コマンドと同等)。

if [ 条件 ]; then

[[ ]] を使う場合です(Bash拡張・推奨)。

if [[ 条件 ]]; then

論理演算子を使います。

if [ 条件1 ] && [ 条件2 ]; then
if [[ 条件1 && 条件2 ]]; then

よく使う条件式一覧

条件式概要
[ -e ファイル ]ファイルまたはディレクトリが存在するなら真です。
[ -f ファイル ]通常ファイルが存在するなら真です。
[ -d ディレクトリ ]ディレクトリが存在するなら真です。
[ -z "$var" ]変数が空文字列なら真です。
[ -n "$var" ]変数が空でないなら真です。
[ "$a" = "$b" ]文字列が等しいなら真です(== も可)。
[ "$a" != "$b" ]文字列が異なるなら真です。
[ $a -eq $b ]整数が等しいなら真です。
[ $a -ne $b ]整数が異なるなら真です。
[ $a -lt $b ]a が b より小さいなら真です。
[ $a -gt $b ]a が b より大きいなら真です。
[[ $str =~ 正規表現 ]]文字列が正規表現にマッチするなら真です([[ ]] のみ)。

サンプルコード

ファイルの存在を『-f』で確認し、結果に応じてメッセージを出力します。

check_file.sh
#!/bin/bash
file="config.json"
if [ -f "$file" ]; then
    echo "$file が見つかりました"
else
    echo "$file が見つかりません"
fi
bash check_file.sh
config.json が見つかりません

なお、if 文はターミナルでも直接入力できます。『then』の後で Enter を押すと『> 』マークが表示され、これは「まだ入力が続く」というサインで、『fi』を入力すると実行されます。

if [ -f "config.json" ]; then
    echo "見つかりました"
else
    echo "見つかりません"
fi
見つかりません

数値の比較で多段分岐します。『-ge』は「以上」を意味します。

grade.sh
score=85
if [ $score -ge 90 ]; then
    echo "A(優)"
elif [ $score -ge 80 ]; then
    echo "B(良)"
elif [ $score -ge 70 ]; then
    echo "C(可)"
else
    echo "D(不可)"
fi
bash grade.sh
B(良)

文字列の比較には『[[ ]]』を使います。変数のクォート忘れにも安全です。

check_env.sh
env="production"
if [[ "$env" = "production" ]]; then
    echo "本番環境です"
fi
bash check_env.sh
本番環境です

『[[ ]]』内では『&&』『||』で論理演算ができます。

check_age.sh
age=25
if [[ $age -ge 18 && $age -lt 65 ]]; then
    echo "成人・現役世代です"
fi
bash check_age.sh
成人・現役世代です

『[[ ]]』の『=~』演算子で正規表現マッチができます。

check_email.sh
email="user@example.com"
if [[ "$email" =~ ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ ]]; then
    echo "有効なメールアドレスです"
fi
bash check_email.sh
有効なメールアドレスです

コマンドの終了ステータスを直接条件にできます。『grep -q』は一致すればステータス0(真)を返します。

check_error.sh
# app.log にエラーが含まれるかチェック
if grep -q "ERROR" app.log; then
    echo "エラーが見つかりました"
fi

概要

『[ ]』と『[[ ]]』の違いは重要です。『[ ]』はPOSIX準拠の test コマンドと同等で、変数のクォートを忘れると単語分割が起きてエラーになることがあります。『[[ ]]』はBash拡張で、正規表現マッチ(=~)・パターンマッチ・論理演算子の『&& ||』が使え、変数のクォートがなくても安全です。現代のBashスクリプトでは [[ ]] を推奨します。

条件式の詳細な演算子一覧は test / [ ] / [[ ]] を参照してください。多値分岐には case が便利です。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。