[Linux] bashでのif-then-else-fiの使い方をマスターする

bashでのif-then-else-fi構文は、条件分岐を行うための基本的な制御構文です。

ifの後に条件式を置き、thenの後に条件が真の場合に実行するコマンドを記述します。

elseは条件が偽の場合に実行するコマンドを指定し、最後にfiで終了します。

例えば、if [ 条件 ]; then コマンド; else コマンド; fiの形式で使用します。

条件式には[ 条件 ][[ 条件 ]]を使い、数値比較や文字列比較、ファイルの存在確認などが可能です。

この記事でわかること
  • Bashのif文の基本構文
  • 条件式の詳細な書き方
  • ネストされたif文の活用法
  • 複雑な条件分岐の実践例
  • エラーハンドリングの手法

目次から探す

if-then-else-fi構文の基本

if-then-else-fiの基本構文

Bashにおけるif-then-else-fi構文は、条件に基づいて異なる処理を実行するための基本的な制御構文です。

以下が基本的な構文です。

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

条件式の書き方

条件式は、[] で囲まれた部分に記述します。

条件式には数値や文字列の比較、ファイルの存在確認などが含まれます。

以下は一般的な条件式の例です。

  • 数値比較: [ $a -lt $b ] (aがbより小さい)
  • 文字列比較: [ "$str1" = "$str2" ] (str1とstr2が等しい)
  • ファイル存在確認: [ -e "filename" ] (filenameが存在する)

thenとelseの役割

  • then: 条件式が真の場合に実行される処理を記述します。
  • else: 条件式が偽の場合に実行される処理を記述します。

elseは省略可能で、必要に応じて使用します。

fiでの終了

fiif文の終了を示すキーワードです。

if文を正しく終了させるために必ず必要です。

fiがないと、Bashは構文エラーを返します。

シンプルな例:数値の比較

以下は、数値を比較するシンプルな例です。

変数numが10より大きいかどうかをチェックします。

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

シンプルな例:文字列の比較

次に、文字列を比較する例です。

変数strが”Hello”と等しいかどうかをチェックします。

str="Hello"
if [ "$str" = "Hello" ]; then
    echo "strはHelloです。"
else
    echo "strはHelloではありません。"
fi
strはHelloです。

条件式の詳細

数値の比較演算子

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

以下に主要な演算子を示します。

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

-eq、-ne、-lt、-le、-gt、-geの使い方

これらの演算子を使って、数値の比較を行います。

以下はそれぞれの演算子を使った例です。

a=5
b=10
if [ $a -lt $b ]; then
    echo "$a は $b より小さいです。"
fi
5 は 10 より小さいです。

文字列の比較演算子

文字列を比較するための演算子もいくつかあります。

以下に主要な演算子を示します。

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

=、!=、-z、-nの使い方

これらの演算子を使って、文字列の比較を行います。

以下はそれぞれの演算子を使った例です。

str="Hello"
if [ "$str" != "World" ]; then
    echo "$str は World ではありません。"
fi
Hello は World ではありません。

ファイルの存在確認

Bashでは、ファイルの存在を確認するための演算子も用意されています。

以下に主要な演算子を示します。

スクロールできます
演算子説明
-e存在する[ -e "filename" ]
-f通常のファイルである[ -f "filename" ]
-dディレクトリである[ -d "directoryname" ]

-e、-f、-dの使い方

これらの演算子を使って、ファイルやディレクトリの存在を確認します。

以下はそれぞれの演算子を使った例です。

if [ -f "example.txt" ]; then
    echo "example.txt は存在します。"
else
    echo "example.txt は存在しません。"
fi
example.txt は存在します。

複数条件の組み合わせ

複数の条件を組み合わせて、より複雑な条件式を作成することができます。

以下に主要な演算子を示します。

スクロールできます
演算子説明
&&両方の条件が真である場合[ 条件1 ] && [ 条件2 ]
||いずれかの条件が真である場合[ 条件1 ] || [ 条件2 ]

&&と||の使い方

これらの演算子を使って、条件を組み合わせます。

以下はそれぞれの演算子を使った例です。

a=5
b=10
if [ $a -lt $b ] && [ $b -gt 0 ]; then
    echo "$a は $b より小さく、$b は正の数です。"
fi
5 は 10 より小さく、10 は正の数です。

-aと-oの使い方

-a(AND)と-o(OR)を使って条件を組み合わせることもできますが、&&||の方が一般的です。

以下はそれぞれの演算子を使った例です。

if [ $a -lt $b -a $b -gt 0 ]; then
    echo "$a は $b より小さく、$b は正の数です。"
fi
5 は 10 より小さく、10 は正の数です。

else-if (elif)の使い方

elifの基本構文

elifは、if文の中で複数の条件をチェックするために使用されるキーワードです。

ifの条件が偽の場合に、次の条件を評価するために使います。

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

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

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

elifを使うことで、複数の条件を順に評価し、最初に真となる条件の処理を実行します。

以下は、elifを使った条件分岐の例です。

num=15
if [ $num -lt 10 ]; then
    echo "numは10より小さいです。"
elif [ $num -eq 10 ]; then
    echo "numは10です。"
elif [ $num -gt 10 ] && [ $num -lt 20 ]; then
    echo "numは10より大きく、20より小さいです。"
else
    echo "numは20以上です。"
fi
numは10より大きく、20より小さいです。

elifを使った実践例

以下は、ユーザーからの入力に基づいて異なるメッセージを表示する実践的な例です。

ユーザーが入力した数値に応じて、異なる処理を行います。

echo "数値を入力してください: "
read input
if [ $input -lt 0 ]; then
    echo "入力された数値は負の数です。"
elif [ $input -eq 0 ]; then
    echo "入力された数値はゼロです。"
elif [ $input -gt 0 ] && [ $input -le 10 ]; then
    echo "入力された数値は1から10の範囲です。"
else
    echo "入力された数値は10より大きいです。"
fi
数値を入力してください: 
6
入力された数値は1から10の範囲です。

このように、elifを使うことで、複数の条件を簡潔に処理することができます。

ネストされたif文

ネストの基本構文

ネストされたif文とは、if文の中に別のif文を含めることを指します。

これにより、条件をさらに細かく分岐させることができます。

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

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

ネストされたif文の実践例

以下は、数値の範囲をチェックするネストされたif文の例です。

この例では、数値が正の数かどうかを確認し、さらにその数が偶数か奇数かを判断します。

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

ネストの際の注意点

ネストされたif文を使用する際には、以下の点に注意が必要です。

  • 可読性: ネストが深くなると、コードの可読性が低下します。

必要以上にネストを重ねないようにしましょう。

  • インデント: ネストされたif文は、インデントを使って階層を明確にすることが重要です。

これにより、どの条件がどのブロックに属しているかが分かりやすくなります。

  • 条件の複雑さ: 複雑な条件をネストする場合、条件式を整理して、可能であれば関数に分けることを検討してください。

これにより、コードの保守性が向上します。

これらの注意点を考慮しながら、ネストされたif文を効果的に活用しましょう。

複雑な条件分岐の実践例

ファイルの存在と書き込み権限を確認する

以下の例では、指定したファイルが存在するかどうかを確認し、さらにそのファイルに書き込み権限があるかどうかをチェックします。

これにより、ファイルの操作を行う前に必要な条件を確認できます。

filename="example.txt"
if [ -e "$filename" ]; then
    echo "$filename は存在します。"
    if [ -w "$filename" ]; then
        echo "$filename に書き込み権限があります。"
    else
        echo "$filename に書き込み権限がありません。"
    fi
else
    echo "$filename は存在しません。"
fi
example.txt は存在します。
example.txt に書き込み権限があります。

ユーザー入力に基づく条件分岐

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

ユーザーが入力した数値が正の数、負の数、またはゼロであるかを判断します。

echo "数値を入力してください: "
read input
if [ "$input" -gt 0 ]; then
    echo "入力された数値は正の数です。"
elif [ "$input" -lt 0 ]; then
    echo "入力された数値は負の数です。"
else
    echo "入力された数値はゼロです。"
fi
入力された数値は負の数です。

環境変数を使った条件分岐

環境変数を使用して、システムの状態や設定に基づいて条件分岐を行うこともできます。

以下の例では、HOME環境変数を使って、ユーザーのホームディレクトリが存在するかどうかを確認します。

if [ -d "$HOME" ]; then
    echo "ホームディレクトリは存在します: $HOME"
    if [ -w "$HOME" ]; then
        echo "ホームディレクトリに書き込み権限があります。"
    else
        echo "ホームディレクトリに書き込み権限がありません。"
    fi
else
    echo "ホームディレクトリは存在しません。"
fi
ホームディレクトリは存在します: /home/username
ホームディレクトリに書き込み権限があります。

これらの実践例を通じて、複雑な条件分岐を効果的に活用し、スクリプトの柔軟性を高めることができます。

エラーハンドリングとif文

コマンドの実行結果を条件に使う

Bashでは、コマンドの実行結果を条件として使用することができます。

コマンドが成功した場合は真(0)、失敗した場合は偽(非0)を返します。

以下の例では、lsコマンドを使ってディレクトリの内容を表示し、成功したかどうかを確認します。

directory="some_directory"
if ls "$directory"; then
    echo "$directory の内容を表示しました。"
else
    echo "$directory は存在しないか、アクセスできません。"
fi
some_directory の内容を表示しました。

$?を使ったエラーチェック

$?は、直前に実行したコマンドの終了ステータスを返します。

これを使って、コマンドが成功したかどうかを確認することができます。

以下の例では、cpコマンドを使ってファイルをコピーし、その結果をチェックします。

cp source.txt destination.txt
if [ $? -eq 0 ]; then
    echo "ファイルのコピーに成功しました。"
else
    echo "ファイルのコピーに失敗しました。"
fi
ファイルのコピーに成功しました。

||と&&を使った簡易エラーハンドリング

||(OR)と&&(AND)を使うことで、簡潔にエラーハンドリングを行うことができます。

&&は前のコマンドが成功した場合に次のコマンドを実行し、||は前のコマンドが失敗した場合に次のコマンドを実行します。

以下の例では、ファイルのコピーを行い、成功した場合はメッセージを表示し、失敗した場合はエラーメッセージを表示します。

cp source.txt destination.txt && echo "ファイルのコピーに成功しました。" || echo "ファイルのコピーに失敗しました。"
ファイルのコピーに成功しました。

このように、if文や$?||&&を使うことで、Bashスクリプトにおけるエラーハンドリングを効果的に行うことができます。

これにより、スクリプトの信頼性と安定性を向上させることができます。

応用例

スクリプトの引数チェックにif文を使う

スクリプトに引数を渡す際、引数の数や内容をチェックすることは重要です。

以下の例では、スクリプトが引数を1つ受け取ることを期待し、引数が不足している場合にエラーメッセージを表示します。

if [ $# -ne 1 ]; then
    echo "使用法: $0 <引数>"
    exit 1
fi
echo "引数は: $1"
使用法: ./script.sh <引数>

サービスの状態確認スクリプト

特定のサービスが実行中かどうかを確認するスクリプトを作成することもできます。

以下の例では、nginxサービスの状態を確認し、実行中かどうかを表示します。

if systemctl is-active --quiet nginx; then
    echo "nginxサービスは実行中です。"
else
    echo "nginxサービスは停止しています。"
fi
nginxサービスは実行中です。

バックアップスクリプトでの条件分岐

バックアップスクリプトでは、バックアップ先のディレクトリが存在するかどうかを確認し、存在しない場合は作成する処理を追加できます。

以下の例では、バックアップ先のディレクトリを確認し、必要に応じて作成します。

backup_dir="/path/to/backup"
if [ ! -d "$backup_dir" ]; then
    echo "$backup_dir が存在しないため、作成します。"
    mkdir -p "$backup_dir"
fi
cp /path/to/source/* "$backup_dir/"
echo "バックアップが完了しました。"
/path/to/backup が存在しないため、作成します。
バックアップが完了しました。

ログファイルの解析スクリプトでのif文活用

ログファイルを解析するスクリプトでは、特定のエラーメッセージが含まれているかどうかをチェックし、エラーが見つかった場合に通知することができます。

以下の例では、error.logファイルをチェックし、エラーメッセージが含まれているかを確認します。

log_file="error.log"
if grep -q "ERROR" "$log_file"; then
    echo "エラーメッセージがログファイルに見つかりました。"
else
    echo "ログファイルにはエラーメッセージはありません。"
fi
エラーメッセージがログファイルに見つかりました。

これらの応用例を通じて、if文を活用したさまざまなスクリプトの実装方法を理解し、実際のシナリオでの利用を促進することができます。

よくある質問

if文の条件式が正しく動作しないのはなぜ?

if文の条件式が正しく動作しない場合、以下の点を確認してください。

  • スペース: 条件式の前後にスペースが必要です。

例えば、[ $a -eq $b ]のように書く必要があります。

  • 演算子の誤り: 使用している演算子が正しいか確認してください。

数値比較には-eq-ne-ltなどを使用し、文字列比較には=!=を使用します。

  • 変数の値: 変数が正しく設定されているか、または期待する値が入っているかを確認してください。

特に、未定義の変数を使用するとエラーになります。

  • シェルの種類: スクリプトを実行しているシェルがBashであることを確認してください。

他のシェルでは構文が異なる場合があります。

elifとelseの違いは何ですか?

elifelseは、条件分岐において異なる役割を持ちます。

  • elif: 追加の条件を評価するために使用します。

ifの条件が偽の場合に、次の条件をチェックします。

複数の条件を持つ場合に便利です。

  • else: すべての条件が偽である場合に実行される処理を記述します。

elseは条件を持たず、最後のフォールバックとして機能します。

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

複数の条件を組み合わせる際の注意点は?

複数の条件を組み合わせる際には、以下の点に注意してください。

  • 演算子の使用: 複数の条件を組み合わせる際には、&&(AND)や||(OR)を使用します。

これらの演算子を正しく使うことで、条件の論理を明確にできます。

  • 優先順位: 演算子の優先順位に注意してください。

必要に応じて、条件を括弧で囲むことで、評価の順序を明示的に指定できます。

  • 可読性: 複雑な条件式は可読性を低下させる可能性があります。

条件を整理し、必要に応じてコメントを追加することで、他の人が理解しやすいコードにしましょう。

  • テスト: 複数の条件を組み合わせた場合、すべての条件の組み合わせをテストして、期待通りに動作することを確認してください。

特に、境界条件やエッジケースに注意を払いましょう。

まとめ

この記事では、Bashにおけるif-then-else-fi構文や条件式の詳細、ネストされたif文、エラーハンドリングの方法、さまざまな応用例について解説しました。

これにより、条件分岐を効果的に活用するための具体的な手法を学ぶことができました。

今後は、実際のスクリプト作成において、これらの知識を活かしてより柔軟で堅牢なプログラムを作成してみてください。

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