シェルスクリプトにおける「制御フロー(Flow Control)」は、スクリプトの実行順序を管理するために非常に重要な役割を果たします。シェルスクリプトでは、ユーザーの入力に基づいて異なる処理を行ったり、複雑な条件に応じて処理を分岐させたりすることが求められます。この「制御フロー」を適切に活用することで、効率的で柔軟なスクリプトを作成することができます。本記事では、シェルスクリプトにおける制御フローの基本的な構造とその使い方を、詳細に解説していきます。
1. 条件分岐(if 文)
シェルスクリプトで最も基本的な制御フローは「条件分岐(if)」です。これは、指定した条件に基づいて、異なるコードブロックを実行するために使用されます。if
文は次のように使います。
bashif [ 条件 ]; then
コマンド1
elif [ 別の条件 ]; then
コマンド2
else
コマンド3
fi
ここでは、まず条件が評価され、その条件が真の場合に最初のコマンドが実行されます。もし条件が偽の場合、次に elif
を使って別の条件を評価し、最後に else
で代替処理を行います。
例:
bash#!/bin/bash
num=5
if [ $num -gt 10 ]; then
echo "10より大きい"
elif [ $num -eq 5 ]; then
echo "5と等しい"
else
echo "10未満"
fi
このスクリプトでは、変数 num
の値に基づいて適切なメッセージを表示します。
2. 繰り返し処理(Looping)
シェルスクリプトでは、特定のコードブロックを何度も繰り返し実行するために「繰り返し処理」を使用します。繰り返し処理には主に for
、while
、および until
の3つのループ構造があります。
a. for
ループ
for
ループは、指定したリストや範囲に対して繰り返し処理を行います。
bashfor 変数 in リスト; do
コマンド
done
例:
bash#!/bin/bash
for i in 1 2 3 4 5; do
echo "番号は $i です"
done
このスクリプトは、1から5までの番号を順番に出力します。
b. while
ループ
while
ループは、指定した条件が真である限り繰り返し処理を行います。
bashwhile [ 条件 ]; do
コマンド
done
例:
bash#!/bin/bash
count=1
while [ $count -le 5 ]; do
echo "カウントは $count です"
((count++))
done
このスクリプトでは、カウントが5以下の間、カウント値を表示し続けます。
c. until
ループ
until
ループは、条件が偽である間繰り返し処理を行います。while
ループと逆の動作をします。
bashuntil [ 条件 ]; do
コマンド
done
例:
bash#!/bin/bash
count=1
until [ $count -gt 5 ]; do
echo "カウントは $count です"
((count++))
done
このスクリプトでは、カウントが5を超えるまで繰り返し処理を行います。
3. case 文
複数の条件を一度に評価したい場合には case
文を使用します。case
文は、指定された値がいくつかのパターンのどれに一致するかを調べ、それに応じた処理を実行します。
bashcase $変数 in
パターン1)
コマンド1
;;
パターン2)
コマンド2
;;
*)
コマンド3
;;
esac
例:
bash#!/bin/bash
fruit="apple"
case $fruit in
"apple")
echo "リンゴを選びました"
;;
"banana")
echo "バナナを選びました"
;;
*)
echo "他の果物を選びました"
;;
esac
このスクリプトでは、変数 fruit
の値に応じて異なるメッセージを表示します。
4. 条件式の評価
シェルスクリプトで条件式を評価する際には、いくつかの演算子を使用します。以下はよく使う比較演算子の一部です。
数値の比較:
-eq
: 等しい-ne
: 等しくない-lt
: より小さい-le
: 以下-gt
: より大きい-ge
: 以上
文字列の比較:
=
: 等しい!=
: 等しくない-z
: 空である-n
: 空でない
ファイルの状態:
-e
: ファイルが存在する-d
: ディレクトリである-f
: ファイルである-r
: 読み取り可能-w
: 書き込み可能-x
: 実行可能
例:
bash#!/bin/bash
file="test.txt"
if [ -e $file ]; then
echo "$file は存在します"
else
echo "$file は存在しません"
fi
このスクリプトでは、test.txt
が存在するかどうかを確認しています。
5. 早期終了(exit)
シェルスクリプトを早期に終了させたい場合には exit
コマンドを使用します。exit
コマンドには終了ステータスを指定できます。ステータスが 0
の場合、正常終了を意味し、それ以外の数値は異常終了を示します。
bash#!/bin/bash
if [ ! -f "test.txt" ]; then
echo "test.txt が存在しません"
exit 1
fi
echo "test.txt が存在します"
exit 0
このスクリプトは、test.txt
が存在しない場合にエラーメッセージを表示して終了します。
6. 終了ステータスの使用
シェルスクリプトでは、コマンドが正常に実行されたかどうかを確認するために終了ステータス(exit status)を活用します。各コマンドは実行後、終了ステータスを返します。終了ステータスが 0
の場合は成功を意味し、それ以外の値はエラーを意味します。
bash#!/bin/bash
mkdir test_directory
if [ $? -eq 0 ]; then
echo "ディレクトリが作成されました"
else
echo "ディレクトリの作成に失敗しました"
fi
このスクリプトでは、mkdir
コマンドが成功したかどうかを確認し、その結果に基づいてメッセージを表示します。
シェルスクリプトにおける制御フローの基本的な構造を理解し、適切に活用することで、より柔軟で強力なスクリプトを作成することができます。条件分岐やループを適切に使い分け、エラー処理や終了ステータスの管理を行うことで、スクリプトの可読性と信頼性を高めることができます。