シェルスクリプト · 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

bashでのforを使用したループ文

この例では、変数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

forループ文を使用した文字列値の読み取り

行list=”var1 var2 var3 var4”は、リスト変数の値を定義します。次に、行for var in $listでvarに割り当てられ、最後に行mkdir $varでディレクトリが作成されます。

構文3: ファイルをリストとして持つforループ文

catコマンドを使用して、コード内で宣言する代わりに、既存のファイルからリストを取得してforループ文で使用することもできます。たとえば、お気に入りのテキストエディタを開き、少なくとも5つのディレクトリ名をリストアップします。

forループを使用してテキストファイルからディレクトリを作成

次に、同じテキストエディタで新しいタブを開き、新しいスクリプトを作成します。このスクリプトは、以前に作成したディレクトリのリストが保存されているのと同じディレクトリに保存する必要があります。

#!/bin/bash   
 dirList=$(cat list)   
 echo "ディレクトリを作成しています...."  
 for var in $dirList   
 do   
 mkdir $var   
 done

forループを使用してテキストファイルからディレクトリを作成

この例は、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

bashでのforループ文

Whileループ文

while文は、キーワードwhileを利用するbashの繰り返し構造の一種です。C型構文のforループ構造とは異なり、while繰り返し制御構造は初期化、ブールテスト、および増分/減分文を分離します。

構文1: 算術記号に基づく条件文を持つwhile構造

<初期化>  
 while(condition)  
 do  
     ###ここにあなたのコードを記述  
 <増分/減分>  
 done

whileを他のループ文と区別するために、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

bashシェルスクリプトにおけるwhileループ文

例を見てみると、while文はカウンタ変数varの初期化から始まります。次に、キーワードwhileの後にブールテストが宣言され、繰り返される文のセットがdoとdone文の内側に宣言されます。while文では、インタープリタはブールテストの結果がtrueである場合にのみコードの繰り返しを開始し、実行します。一方、ループ文はブール式の結果がfalseになるとコードの反復を終了します。

構文2: ニーモニックに基づく条件文を持つwhileループ文

<初期化>  
 while [ <条件> ]  
 do  
 ####ここにあなたのコードを記述  
 <増分/減分>  
 done

whileループ文内にニーモニックに基づく条件文を宣言することもできます。宣言には、括弧の代わりに角括弧を使用します。(ニーモニックに基づく条件文についてはここを参照)例えば:

#!/bin/bash   
 var=1;   
 while [ $var -le 5 ]   
 do   
 printf "整数を入力してください %d : " $var   
 read input   
 result=$((result+input))   
 var=$((var+1))   
 done   
 echo "結果は " $result

シェルスクリプトにおけるwhileループ文

構文3: ファイルベースの条件文を持つwhileループ文

while read <変数名>  
 do   
 ####ここにあなたのコードを記述   
 done <<テキストファイルへのパス>

forループ文で行ったように、テキストファイルを開いてwhileループ文に関連付けることもできます。例えば:

#!/bin/bash   
 mkdir sample2  
cd sample2   
 echo "ディレクトリを作成しています..."  
 while read var   
 do   
     mkdir $var   
 done

bashスクリプトでwhileループを使用してファイルを読み取る

この例では、以前に作成したリストを再利用し、同じディレクトリに新しいスクリプトを作成しました。テキストファイルが異なるディレクトリにある場合は、<記号の後にファイルの正確なパスを指定する必要があります。

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

シェルスクリプトにおけるuntilループ文

構文2: ニーモニックに基づく条件文を持つuntilループ文

<初期化>  
 until [ <条件> ]  
 do  
      ####ここにあなたのコードを記述  
 <増分/減分>  
 done

until文は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

シェルスクリプトにおけるuntilループ文

結論

このチュートリアルのパートでは、bashがサポートする3つのループ構造 - for、while、およびuntilループ文 - をカバーしました。これらの文はそれぞれ異なる構造、使用法、および利点を持っています。bashは異なる構造をサポートしており、プログラマーにより多くの選択肢を提供し、シェルスクリプトを簡単にコーディングできるようにしています。

Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。