開発運用

シェルスクリプトの制御フロー

シェルスクリプトにおける「制御フロー(Flow Control)」は、スクリプトの実行順序を管理するために非常に重要な役割を果たします。シェルスクリプトでは、ユーザーの入力に基づいて異なる処理を行ったり、複雑な条件に応じて処理を分岐させたりすることが求められます。この「制御フロー」を適切に活用することで、効率的で柔軟なスクリプトを作成することができます。本記事では、シェルスクリプトにおける制御フローの基本的な構造とその使い方を、詳細に解説していきます。

1. 条件分岐(if 文)

シェルスクリプトで最も基本的な制御フローは「条件分岐(if)」です。これは、指定した条件に基づいて、異なるコードブロックを実行するために使用されます。if 文は次のように使います。

bash
if [ 条件 ]; 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)

シェルスクリプトでは、特定のコードブロックを何度も繰り返し実行するために「繰り返し処理」を使用します。繰り返し処理には主に forwhile、および until の3つのループ構造があります。

a. for ループ

for ループは、指定したリストや範囲に対して繰り返し処理を行います。

bash
for 変数 in リスト; do コマンド done

例:

bash
#!/bin/bash for i in 1 2 3 4 5; do echo "番号は $i です" done

このスクリプトは、1から5までの番号を順番に出力します。

b. while ループ

while ループは、指定した条件が真である限り繰り返し処理を行います。

bash
while [ 条件 ]; do コマンド done

例:

bash
#!/bin/bash count=1 while [ $count -le 5 ]; do echo "カウントは $count です" ((count++)) done

このスクリプトでは、カウントが5以下の間、カウント値を表示し続けます。

c. until ループ

until ループは、条件が偽である間繰り返し処理を行います。while ループと逆の動作をします。

bash
until [ 条件 ]; do コマンド done

例:

bash
#!/bin/bash count=1 until [ $count -gt 5 ]; do echo "カウントは $count です" ((count++)) done

このスクリプトでは、カウントが5を超えるまで繰り返し処理を行います。

3. case 文

複数の条件を一度に評価したい場合には case 文を使用します。case 文は、指定された値がいくつかのパターンのどれに一致するかを調べ、それに応じた処理を実行します。

bash
case $変数 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 コマンドが成功したかどうかを確認し、その結果に基づいてメッセージを表示します。


シェルスクリプトにおける制御フローの基本的な構造を理解し、適切に活用することで、より柔軟で強力なスクリプトを作成することができます。条件分岐やループを適切に使い分け、エラー処理や終了ステータスの管理を行うことで、スクリプトの可読性と信頼性を高めることができます。

Back to top button