シェルスクリプト · 1 min read · Nov 14, 2025
シェルスクリプト パート4: 繰り返し制御構造
HowtoForgeのシェルスクリプトチュートリアルシリーズのパート4へようこそ(チュートリアルのパート1、パート2、パート3を読むにはこちらをクリック)。このパートでは、bashシェルのさまざまな繰り返し制御構造と、それぞれの構造を使用する方法をいくつかの例を提供しながら説明します。さあ、始めましょう。
はじめに
繰り返し制御構造(ループ制御構造とも呼ばれる)は、プログラミング言語における制御構造の一種で、繰り返しまたは再帰的なタスクを簡素化するために使用されます。ループ文は、同じ出力を提供する非構造化コードよりも、コードを最小限に抑える方法を提供することで、コードを最適化し、トラブルシューティングを容易にします。bashシェルがサポートするループ文には、for、while、およびuntilの3種類があります。
Forループ
forループは、キーワードforを使用して繰り返し文を宣言するループ文です。bashはforループ文の異なる構文をサポートしています。
構文1: For-in構造
for in
do
#### ここにあなたの文を記述
done
この構文は、キーワードforで始まり、その後に変数名、キーワードin、および変数の可能な値のリストが続きます。リスト内の各値はスペースで区切られ、繰り返されるコード行の開始はdoで定義され、doneキーワードで終了します。
ユーザーが5つの値を入力し、数値の合計を取得できるシンプルなforループ文を作成してみましょう。
#!/bin/bash
result=0;
input=0;
for var in 1 2 3 4 5
do
printf "整数を入力してください %d : " $var
read input
result=$((result+input))
done
echo "結果は " $result
この例では、変数varがループのカウンタとして機能します。その値はキーワードinの後の数値のリストで定義され、シェルはループ文の各実行後にvar変数の値を変更します。リストには5つの整数値しかないため、シェルはループ文内のコードを5回だけ実行します。
構文2: 文字列リスト値を持つforループ文
カウンタのアイテムリストを保持する変数を宣言することもできます。たとえば、次のコードを考えてみましょう。
#!/bin/bash
list="var1 var2 var3 var4"
var=""
mkdir sample
cd sample
echo "ディレクトリを作成しています...."
for var in $list
do
mkdir $var
done
行list=”var1 var2 var3 var4”は、リスト変数の値を定義します。次に、行for var in $listでvarに割り当てられ、最後に行mkdir $varでディレクトリが作成されます。
構文3: ファイルをリストとして持つforループ文
catコマンドを使用して、コード内で宣言する代わりに、既存のファイルからリストを取得してforループ文で使用することもできます。たとえば、お気に入りのテキストエディタを開き、少なくとも5つのディレクトリ名をリストアップします。

次に、同じテキストエディタで新しいタブを開き、新しいスクリプトを作成します。このスクリプトは、以前に作成したディレクトリのリストが保存されているのと同じディレクトリに保存する必要があります。
#!/bin/bash
dirList=$(cat list)
echo "ディレクトリを作成しています...."
for var in $dirList
do
mkdir $var
done
この例は、Linuxコンピュータで何百ものディレクトリを作成する必要があるときに便利です。
構文4: C風構文
for((初期化; ブールテスト; 増分/減分))
do
#### ここにあなたのコードを記述
doneおそらく、シェルがサポートする最も馴染みのあるforループの構造はC風の構造です。ループはカウンタ変数の初期化から始まり、その後シェルは初期化の後に宣言されたブール式を評価します。ブール式の結果がtrueであれば、シェルはdo句内の文のセットを実行し、そうでなければループ文を終了し、doneキーワードの後の行に進みます。シェルはブールテストの後に宣言された増分または減分文を通じて次の反復に進みます。例として、最初の例をこの構造を使用して再構築してみましょう。
#!/bin/bash
result=0
input=0
for((var=1;var<=5;var++))
do
printf "整数を入力してください %d : " $var
read input
result=$((result+input))
done
echo $result
Whileループ文
while文は、キーワードwhileを利用するbashの繰り返し構造の一種です。C型構文のforループ構造とは異なり、while繰り返し制御構造は初期化、ブールテスト、および増分/減分文を分離します。
構文1: 算術記号に基づく条件文を持つwhile構造
<初期化>
while(condition)
do
###ここにあなたのコードを記述
<増分/減分>
donewhileを他のループ文と区別するために、while文の最初の例を構築してみましょう。
#!/bin/bash
result=0
input=0
var=1
while((var <= 5))
do
printf "整数を入力してください %d : " $var
read input
result=$((result+input))
var=$((var+1))
done
echo "結果は " $result
例を見てみると、while文はカウンタ変数varの初期化から始まります。次に、キーワードwhileの後にブールテストが宣言され、繰り返される文のセットがdoとdone文の内側に宣言されます。while文では、インタープリタはブールテストの結果がtrueである場合にのみコードの繰り返しを開始し、実行します。一方、ループ文はブール式の結果がfalseになるとコードの反復を終了します。
構文2: ニーモニックに基づく条件文を持つwhileループ文
<初期化>
while [ <条件> ]
do
####ここにあなたのコードを記述
<増分/減分>
donewhileループ文内にニーモニックに基づく条件文を宣言することもできます。宣言には、括弧の代わりに角括弧を使用します。(ニーモニックに基づく条件文についてはここを参照)例えば:
#!/bin/bash
var=1;
while [ $var -le 5 ]
do
printf "整数を入力してください %d : " $var
read input
result=$((result+input))
var=$((var+1))
done
echo "結果は " $result
構文3: ファイルベースの条件文を持つwhileループ文
while read <変数名>
do
####ここにあなたのコードを記述
done <<テキストファイルへのパス>forループ文で行ったように、テキストファイルを開いてwhileループ文に関連付けることもできます。例えば:
#!/bin/bash
mkdir sample2
cd sample2
echo "ディレクトリを作成しています..."
while read var
do
mkdir $var
done

この例では、以前に作成したリストを再利用し、同じディレクトリに新しいスクリプトを作成しました。テキストファイルが異なるディレクトリにある場合は、<記号の後にファイルの正確なパスを指定する必要があります。
Untilループ文
bashがサポートするもう一つのループ文のタイプはuntil構造です。until文は、宣言されたブール式がfalseになるまで、ループ内のすべてのコマンドを実行します。これはwhile文の完全な逆です。
構文1: 算術記号に基づく条件文を持つuntilループ
until ((<条件文>))
do
####コマンドのセット
done例を見てみましょう。
result=0
input=0
var=1
until((var > 5))
do
printf "整数を入力してください %d : " $var
read input
result=$((result+input))
var=$((var+1))
done
echo "結果は " $result
構文2: ニーモニックに基づく条件文を持つuntilループ文
<初期化>
until [ <条件> ]
do
####ここにあなたのコードを記述
<増分/減分>
doneuntil文はwhileループ文の逆であるため、until構造内にニーモニックに基づく条件文を宣言することもできます。ただし、終了させるためには、逆の条件文を宣言する必要があります。つまり、条件文がfalseになるように評価される必要があります。
!/bin/bash
result=0
input=0
var=1
until [ $var -gt 5 ]
do
printf "整数を入力してください %d : " $var
read input
result=$((result+input))
var=$((var+1))
done
echo "結果は " $result
結論
このチュートリアルのパートでは、bashがサポートする3つのループ構造 - for、while、およびuntilループ文 - をカバーしました。これらの文はそれぞれ異なる構造、使用法、および利点を持っています。bashは異なる構造をサポートしており、プログラマーにより多くの選択肢を提供し、シェルスクリプトを簡単にコーディングできるようにしています。
新しい投稿を受信箱で受け取る
スパムはありません。いつでも購読を解除できます。