[Linux] if文でのelseの使い方 – 条件分岐処理

Linuxのシェルスクリプトにおけるif文は、条件に応じて異なる処理を実行するための基本的な構文です。

elseは、ifの条件が満たされなかった場合に実行される処理を定義します。

elseは省略可能で、条件が偽の場合に何も実行しないことも可能です。

この記事でわかること
  • if文とelseの基本的な使い方
  • elifを用いた複数条件の分岐
  • 条件式の詳細な評価方法
  • ネストされたif文の活用法
  • 高度な条件分岐のテクニック

目次から探す

elseの使い方

elseの基本構文

elseは、if文の条件が偽(false)の場合に実行される処理を定義するために使用します。

基本的な構文は以下の通りです。

if [ 条件 ]; then
    # 条件が真の場合の処理
else
    # 条件が偽の場合の処理
fi

elseを使った条件分岐の例

以下は、数値が10より大きいかどうかを判定し、結果に応じてメッセージを表示する例です。

number=5
if [ $number -gt 10 ]; then
    echo "数値は10より大きいです。"
else
    echo "数値は10以下です。"
fi
数値は10以下です。

elseを使わない場合の挙動

elseを使用しない場合、if文の条件が偽の場合は何も実行されません。

以下の例では、条件が偽の場合の処理がないため、何も出力されません。

number=5
if [ $number -gt 10 ]; then
    echo "数値は10より大きいです。"
fi
(何も出力されない)

elseを使う際の注意点

  • elseは必ずif文とペアで使用する必要があります。
  • elseの後には条件を指定することはできません。

条件を指定したい場合はelifを使用します。

  • if文の条件が複雑な場合、可読性を保つために適切にインデントを行うことが重要です。

elifを使った複数条件の分岐

elifの基本構文

elifは、if文の条件が偽の場合に追加の条件を評価するために使用します。

基本的な構文は以下の通りです。

if [ 条件1 ]; then
    # 条件1が真の場合の処理
elif [ 条件2 ]; then
    # 条件2が真の場合の処理
else
    # どちらの条件も偽の場合の処理
fi

elifを使った複数条件の例

以下は、数値に応じて異なるメッセージを表示する例です。

数値が10より大きい、10と等しい、または10より小さいかを判定します。

number=10
if [ $number -gt 10 ]; then
    echo "数値は10より大きいです。"
elif [ $number -eq 10 ]; then
    echo "数値は10です。"
else
    echo "数値は10より小さいです。"
fi
数値は10です。

elifとelseの違い

  • elifは追加の条件を評価するために使用され、複数の条件を持つことができます。
  • elseは、すべての条件が偽の場合に実行される処理を定義します。
  • elifは条件を指定できるのに対し、elseは条件を持たないため、条件分岐の柔軟性が異なります。

elifを使う際の注意点

  • elifは複数回使用することができ、必要に応じて任意の数の条件を追加できます。
  • 各条件は、elifの前にifが必要です。
  • 条件の評価順序に注意し、最も特定的な条件を先に配置することが重要です。

これにより、意図した通りの処理が実行されます。

条件式の詳細

数値比較の条件式

Bashでは、数値を比較するためにいくつかの演算子が用意されています。

以下は、主な数値比較演算子です。

スクロールできます
演算子説明
-eq等しい[ $a -eq $b ]
-ne等しくない[ $a -ne $b ]
-gtより大きい[ $a -gt $b ]
-ltより小さい[ $a -lt $b ]
-ge以上[ $a -ge $b ]
-le以下[ $a -le $b ]

文字列比較の条件式

文字列を比較するためには、=!=を使用します。

以下は、主な文字列比較演算子です。

スクロールできます
演算子説明
=等しい[ "$str1" = "$str2" ]
!=等しくない[ "$str1" != "$str2" ]
-z空文字列[ -z "$str" ]
-n非空文字列[ -n "$str" ]

ファイルの存在確認の条件式

ファイルの存在を確認するためには、以下の演算子を使用します。

スクロールできます
演算子説明
-e存在する[ -e "file.txt" ]
-f通常のファイル[ -f "file.txt" ]
-dディレクトリ[ -d "directory" ]
-r読み取り可能[ -r "file.txt" ]
-w書き込み可能[ -w "file.txt" ]
-x実行可能[ -x "file.txt" ]

論理演算子を使った条件式

複数の条件を組み合わせるために、論理演算子を使用します。

主な論理演算子は以下の通りです。

スクロールできます
演算子説明
-aAND(両方の条件が真)[ 条件1 -a 条件2 ]
-oOR(いずれかの条件が真)[ 条件1 -o 条件2 ]
!NOT(条件が偽)[ ! 条件 ]

複数条件を組み合わせる方法

複数の条件を組み合わせる際は、[ ]の中で論理演算子を使用します。

以下は、数値と文字列の条件を組み合わせた例です。

number=5
str="Hello"
if [ $number -lt 10 ] && [ "$str" = "Hello" ]; then
    echo "数値は10未満で、文字列はHelloです。"
fi
数値は10未満で、文字列はHelloです。

このように、条件式を組み合わせることで、より複雑な条件分岐を実現できます。

実践的な例

ファイルの存在を確認して処理を分岐する

ファイルの存在を確認し、存在する場合はその内容を表示し、存在しない場合はエラーメッセージを表示する例です。

file_name="example.txt"
if [ -e "$file_name" ]; then
    echo "$file_name の内容:"
    cat "$file_name"
else
    echo "エラー: $file_name は存在しません。"
fi
example.txt の内容:
(ファイルの内容が表示される)
エラー: example.txt は存在しません。

ユーザー入力に応じた処理の分岐

ユーザーからの入力に基づいて異なるメッセージを表示する例です。

echo "好きな色を入力してください:"
read color
if [ "$color" = "赤" ]; then
    echo "あなたは情熱的ですね!"
elif [ "$color" = "青" ]; then
    echo "あなたは冷静ですね!"
else
    echo "あなたの選んだ色はユニークですね!"
fi
あなたは冷静ですね!

数値の大小による処理の分岐

数値を入力し、その値に応じて異なるメッセージを表示する例です。

echo "数値を入力してください:"
read number
if [ $number -gt 100 ]; then
    echo "数値は100より大きいです。"
elif [ $number -eq 100 ]; then
    echo "数値は100です。"
else
    echo "数値は100より小さいです。"
fi
数値は100より小さいです。

サービスの状態に応じた処理の分岐

特定のサービスが稼働中かどうかを確認し、稼働中であればその旨を表示し、停止中であれば再起動を促す例です。

service_name="httpd"
if systemctl is-active --quiet "$service_name"; then
    echo "$service_name は稼働中です。"
else
    echo "$service_name は停止中です。再起動します。"
    systemctl start "$service_name"
fi
httpd は停止中です。再起動します。

このように、実際のシナリオに基づいて条件分岐を活用することで、柔軟なスクリプトを作成することができます。

ネストされたif文

ネストされたif文の基本構文

ネストされたif文は、if文の中に別のif文を含めることで、より複雑な条件分岐を実現します。

基本的な構文は以下の通りです。

if [ 条件1 ]; then
    # 条件1が真の場合の処理
    if [ 条件2 ]; then
        # 条件2が真の場合の処理
    else
        # 条件2が偽の場合の処理
    fi
else
    # 条件1が偽の場合の処理
fi

ネストされたif文の例

以下は、数値が正の数かどうかを判定し、さらにその数が偶数か奇数かを判定する例です。

number=4
if [ $number -gt 0 ]; then
    echo "数値は正の数です。"
    if [ $((number % 2)) -eq 0 ]; then
        echo "数値は偶数です。"
    else
        echo "数値は奇数です。"
    fi
else
    echo "数値は0以下です。"
fi
数値は正の数です。
数値は偶数です。

ネストされたif文を使う際の注意点

  • ネストが深くなると、可読性が低下するため、必要以上にネストを増やさないように注意が必要です。
  • if文のブロックを適切にインデントすることで、構造を明確にし、可読性を向上させることが重要です。
  • 複雑な条件分岐が必要な場合は、elifや関数を使用して、ネストを減らすことを検討してください。

ネストの深さと可読性のバランス

ネストの深さは、スクリプトの可読性に大きな影響を与えます。

以下のポイントを考慮して、バランスを取ることが重要です。

  • 可読性: ネストが深くなると、コードの理解が難しくなります。

可能な限り、条件を平坦に保つことを心がけましょう。

  • メンテナンス性: 複雑なネストは、後からの修正や拡張が難しくなるため、シンプルな構造を維持することが望ましいです。
  • 関数の利用: 複雑な条件分岐が必要な場合は、条件を関数に分けることで、ネストを減らし、可読性を向上させることができます。

このように、ネストされたif文を適切に使用することで、柔軟な条件分岐を実現しつつ、可読性を保つことが可能です。

高度な条件分岐

複数の条件を一度に評価する方法

Bashでは、複数の条件を一度に評価するために、論理演算子&&||を使用します。

これにより、条件を組み合わせて、より複雑な条件分岐を実現できます。

以下は、数値が正かつ偶数であるかを判定する例です。

number=8
if [ $number -gt 0 ] && [ $((number % 2)) -eq 0 ]; then
    echo "数値は正の偶数です。"
else
    echo "数値は正の偶数ではありません。"
fi
数値は正の偶数です。

case文との違いと使い分け

case文は、特定の変数の値に基づいて処理を分岐させるための構文です。

if文と異なり、case文は複数の条件を簡潔に記述できるため、特定の値に対する処理が多い場合に便利です。

以下は、case文の例です。

fruit="りんご"
case $fruit in
    "りんご")
        echo "果物はりんごです。"
        ;;
    "バナナ")
        echo "果物はバナナです。"
        ;;
    *)
        echo "未知の果物です。"
        ;;
esac
果物はりんごです。

if文は条件式が複雑な場合に適しており、case文は単純な値の比較に適しています。

状況に応じて使い分けることが重要です。

関数内でのif-elseの使い方

Bashでは、関数内でもif-else文を使用して条件分岐を行うことができます。

以下は、引数に応じて異なるメッセージを表示する関数の例です。

function check_number {
    local number=$1
    if [ $number -gt 0 ]; then
        echo "数値は正の数です。"
    elif [ $number -eq 0 ]; then
        echo "数値はゼロです。"
    else
        echo "数値は負の数です。"
    fi
}
check_number 5
check_number 0
check_number -3
数値は正の数です。
数値はゼロです。
数値は負の数です。

条件式の評価を外部コマンドに依存させる

条件式の評価を外部コマンドの結果に基づいて行うことも可能です。

以下は、特定のプロセスが実行中かどうかを確認する例です。

process_name="bash"
if pgrep "$process_name" > /dev/null; then
    echo "$process_name は実行中です。"
else
    echo "$process_name は実行されていません。"
fi
bash は実行中です。

このように、外部コマンドの結果を条件式に利用することで、より動的な条件分岐を実現できます。

高度な条件分岐を活用することで、スクリプトの柔軟性と機能性を向上させることができます。

よくある質問

elseが実行されないのはなぜ?

elseが実行されない理由は、if文の条件が常に真(true)であるためです。

if文の条件が満たされると、そのブロック内の処理が実行され、elseブロックはスキップされます。

以下のような場合が考えられます。

  • 条件式が常に真になる(例:if [ 1 -eq 1 ]; then)。
  • 条件式の評価に誤りがある(例:数値の比較や文字列の比較が正しく行われていない)。

elifとelseを同時に使うことはできる?

はい、elifelseを同時に使うことができます。

elifは追加の条件を評価するために使用され、elseはすべての条件が偽の場合に実行される処理を定義します。

以下のように、if文の中でelifelseを組み合わせて使用することができます。

if [ 条件1 ]; then
    # 条件1が真の場合の処理
elif [ 条件2 ]; then
    # 条件2が真の場合の処理
else
    # どちらの条件も偽の場合の処理
fi

if文の条件式でエラーが出るのはなぜ?

if文の条件式でエラーが出る理由はいくつかあります。

主な原因は以下の通りです。

  • 構文エラー: 条件式の構文が正しくない(例:[ 条件 ]の形式が間違っている)。
  • スペースの不足: 条件式の前後に必要なスペースがない(例:[条件]ではなく[ 条件 ]とする必要がある)。
  • 変数の未定義: 使用している変数が未定義または空である場合、エラーが発生することがあります。
  • 演算子の誤用: 数値比較や文字列比較の演算子が正しく使用されていない(例:-eq=の誤用)。

これらの点を確認することで、if文の条件式でのエラーを解消することができます。

まとめ

この記事では、Bashにおける条件分岐処理の基本から高度なテクニックまでを詳しく解説しました。

特に、if文、elseelif、ネストされた条件分岐、さらにはcase文や外部コマンドを利用した条件評価について触れました。

これらの知識を活用することで、より柔軟で効率的なスクリプトを作成することが可能になります。

ぜひ、実際のスクリプト作成においてこれらのテクニックを試してみてください。

  • URLをコピーしました!
目次から探す