[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での終了
fi
はif
文の終了を示すキーワードです。
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
文を活用したさまざまなスクリプトの実装方法を理解し、実際のシナリオでの利用を促進することができます。
よくある質問
まとめ
この記事では、Bashにおけるif-then-else-fi
構文や条件式の詳細、ネストされたif
文、エラーハンドリングの方法、さまざまな応用例について解説しました。
これにより、条件分岐を効果的に活用するための具体的な手法を学ぶことができました。
今後は、実際のスクリプト作成において、これらの知識を活かしてより柔軟で堅牢なプログラムを作成してみてください。