Bash スクリプトのループ処理

ShellBeginner
オンラインで実践に進む

はじめに

この実験では、Bash スクリプトにおけるループ(繰り返し処理)の使い方を学びます。ループは、一連の命令を何度も繰り返し実行できる強力なツールであり、スクリプトの効率と柔軟性を大幅に向上させます。ここでは、forwhileuntil の 3 種類のループについて解説します。さらに、ループの実行を細かく制御するための break 文と continue 文についても学習します。この実験は初心者向けに設計されており、各コンセプトをステップバイステップで進めていきます。

環境のセットアップ

まずは、作業環境を整えましょう。ループの実験用ファイルを保存するための新しいディレクトリを作成します。

WebIDE のターミナルを開きます。デフォルトでは /home/labex/project ディレクトリにいるはずです。もし場所がわからない場合は、次のコマンドで移動できます。

cd /home/labex/project

次に、ループの実験専用のディレクトリを作成します。

mkdir bash_loops
cd bash_loops

これにより、bash_loops という名前のディレクトリが作成され、その中に移動します。これ以降の実験はすべてこのディレクトリ内で行います。

なぜこのような操作をするのでしょうか?スクリプトをディレクトリごとに整理するのは良い習慣です。作業環境が整理され、ファイルの検索や管理が容易になります。

for ループ

for ループは、値のリストに対して繰り返し処理を行うために使用されます。「このリストにある各項目について、何かを実行する」というイメージです。では、for ループの使い方を示すスクリプトを作成してみましょう。

bash_loops ディレクトリに for_loop.sh という新しいファイルを作成します。

touch for_loop.sh

次に、WebIDE で for_loop.sh ファイルを開き、以下の内容を入力してください。

#!/bin/bash

## 配列内の名前をループで処理する
echo "Looping through an array:"
NAMES=("Alice" "Bob" "Charlie" "David")
for name in "${NAMES[@]}"; do
  echo "Hello, $name!"
done

echo ## 読みやすくするために空行を出力

## 数値の範囲をループで処理する
echo "Looping through a range of numbers:"
for i in {1..5}; do
  echo "Number: $i"
done

このスクリプトの動作を解説します。

  1. 最初のループは、名前の配列(Array)を順番に処理します。配列内の各名前に対して、挨拶を表示します。
  2. 2 番目のループは、{1..5} という範囲指定を使用して、1 から 5 までカウントします。

"${NAMES[@]}" という構文は少し特殊に見えるかもしれません。@ は「配列のすべての要素」を意味し、引用符と中括弧を使うことで、要素の中にスペースが含まれていても、各要素を正しく個別の項目として扱うことができます。

ファイルを保存し、次のコマンドで実行権限を与えます。

chmod +x for_loop.sh

chmod +x コマンドはファイルを「実行可能」にします。これにより、このファイルをプログラムとして実行できるようになります。

それでは、スクリプトを実行してみましょう。

./for_loop.sh

以下のような出力が表示されるはずです。

Looping through an array:
Hello, Alice!
Hello, Bob!
Hello, Charlie!
Hello, David!

Looping through a range of numbers:
Number: 1
Number: 2
Number: 3
Number: 4
Number: 5

このように、for ループを使うと、配列や数値の範囲を簡単に繰り返し処理できることがわかります。

while ループ

while ループは、指定した条件が「真(true)」である間、コードブロックを実行し続けます。「この条件が満たされている間は、この処理を続けなさい」という命令です。

新しいファイル while_loop.sh を作成します。

touch while_loop.sh

WebIDE で while_loop.sh を開き、以下の内容を追加します。

#!/bin/bash

## while ループを使用したシンプルなカウントダウン
count=5
echo "Countdown:"
while [ $count -gt 0 ]; do
  echo $count
  count=$((count - 1))
  sleep 1 ## 1秒間待機
done
echo "Blast off!"

スクリプトの内容を解説します。

  1. count=5 でカウントダウンの初期値を設定します。
  2. 条件式 [ $count -gt 0 ] は、「変数 count が 0 より大きい間」を意味します。
  3. ループ内では、現在のカウントを表示し、値を 1 減らし、1 秒間待機します。
  4. これを count が 0 になるまで繰り返し、0 になるとループが終了します。

sleep 1 コマンドはスクリプトを 1 秒間一時停止させるため、リアルタイムのカウントダウン効果が得られます。

ファイルを保存して実行権限を付与します。

chmod +x while_loop.sh

スクリプトを実行します。

./while_loop.sh

1 秒ごとに数字が表示され、5 から 1 までのカウントダウンが確認できるはずです。

Countdown:
5
4
3
2
1
Blast off!

これが、条件が満たされなくなるまで処理を繰り返す while ループの仕組みです。

until ループ

until ループは while ループと似ていますが、重要な違いがあります。それは、指定した条件が「真(true)」になるまで実行を続けるという点です。「この条件が満たされるまで、この処理を続けなさい」というイメージです。

新しいファイル until_loop.sh を作成します。

touch until_loop.sh

WebIDE で until_loop.sh を開き、以下の内容を追加します。

#!/bin/bash

## until ループを使用して 5 までカウントアップする
count=1
echo "Counting up to 5:"
until [ $count -gt 5 ]; do
  echo $count
  count=$((count + 1))
  sleep 1 ## 1秒間待機
done

スクリプトの内容を解説します。

  1. count=1 を初期値として設定します。
  2. 条件式 [ $count -gt 5 ] は、「変数 count が 5 より大きくなるまで」を意味します。
  3. ループ内では、現在のカウントを表示し、値を 1 増やし、1 秒間待機します。
  4. count が 5 を超える(つまり 6 になる)まで処理が繰り返されます。

ファイルを保存して実行権限を付与します。

chmod +x until_loop.sh

スクリプトを実行します。

./until_loop.sh

1 から 5 までの数字が 1 秒おきに表示されます。

Counting up to 5:
1
2
3
4
5

このように、until ループは特定の条件が達成されるまで処理を繰り返したい場合に便利です。

break 文と continue 文の使い方

break 文と continue 文は、ループのフローを細かく制御するために使用されます。break はループを途中で完全に終了させ、continue は現在の回の処理をスキップして次の回(イテレーション)へ進みます。

新しいファイル break_continue.sh を作成します。

touch break_continue.sh

WebIDE で break_continue.sh を開き、以下の内容を追加します。

#!/bin/bash

## break を使用してループを途中で抜ける例
echo "Demonstration of break:"
for i in {1..10}; do
  if [ $i -eq 6 ]; then
    echo "Breaking the loop at $i"
    break
  fi
  echo $i
done

echo ## 読みやすくするために空行を出力

## continue を使用して特定の処理をスキップする例(奇数のみ表示)
echo "Demonstration of continue (printing odd numbers):"
for i in {1..10}; do
  if [ $((i % 2)) -eq 0 ]; then
    continue
  fi
  echo $i
done

スクリプトの内容を解説します。

  1. 最初のループでは、i が 6 になったときに break を実行してループを終了させています。
  2. 2 番目のループでは、continue を使って偶数をスキップしています。条件式 $((i % 2)) -eq 0 は、数値が 2 で割り切れるか(余りが 0 か)をチェックしています。

% 演算子は割り算の余りを計算します。したがって、i % 2 は偶数の場合は 0、奇数の場合は 1 になります。

ファイルを保存して実行権限を付与します。

chmod +x break_continue.sh

スクリプトを実行します。

./break_continue.sh

以下のような出力が表示されるはずです。

Demonstration of break:
1
2
3
4
5
Breaking the loop at 6

Demonstration of continue (printing odd numbers):
1
3
5
7
9

break によってループが途中で止まり、continue によって特定の条件(この場合は偶数)のときだけ処理がスキップされていることが確認できます。

まとめ

この実験では、Bash スクリプトにおける 3 種類のループについて学びました。

  1. for ループ:項目のリストや数値の範囲を順番に処理します。
  2. while ループ:条件が真である間、処理を繰り返します。
  3. until ループ:条件が真になるまで、処理を繰り返します。

また、ループの動作をより柔軟に制御するための break 文と continue 文についても学習しました。

これらのループ構造は多くのスクリプトにおいて不可欠な要素であり、定型作業を効率的に自動化することを可能にします。自分でスクリプトを書く際にもこれらのループを活用し、それぞれの挙動や使いどころに慣れていきましょう。