HOWTO · Bash

Bash で for ループを実装する

Bash スクリプトを使用して for ループの反復構造を作成するための簡単なガイド。

このページの内容

このチュートリアルでは、Bash の for ループを作成するために利用できる Bash スクリプトの定式化について説明します。

まず、その基本的な構文と概念を学習します。後で、C スタイルの for ループ表記や foreach または for-in スタイルなど、Bash スクリプトでさまざまなタイプを学習します。

最後に、セミコロンの問題について説明します ; bash プロンプトで for ループを作成している間。

Bash for ループ

プログラミング言語またはスクリプト言語のループは、特定の基準が満たされないまで、ステートメントまたはステートメントのセットを繰り返し実行するために使用される反復制御構造です。

for ループは、特定のステートメントまたはコマンドのセットを指定された回数実行する必要がある場合に特に使用されるループ構造です。bash プロンプトと Bash スクリプトで for ループを使用することもできます。

Bash スクリプトは、for ループを作成するための 2つの構文を提供します。最初のものは C スタイルまたは 3 式ループとして知られており、for ループの C 言語の定式化とほぼ同じです。

2 番目の定式化は、有名な foreach または for-in スタイルの構成であり、PHP、Python、C#、C++ 11、Ruby などの多くの一般的なプログラミング言語でも採用されています。

BashC スタイル for ループ構文

このスタイルでは、C 言語のような 3つの式を使用して、ループの反復回数を指定します。

for (( initialization; condition; increment/decrement ))
do
	Shell command[s]
done

例:ユーザーが指定した数値のテーブルを出力するのに役立つスクリプトを作成するとします。次のコードを使用してそれを行うことができます。

#!/bin/bash
echo "Enter a Number: "
read number

for ((j=1;j<=10;j++))
do  
   echo "$number X $j = $((number*j))"
done

上記のコードは、ユーザーから数値を取得し、そのテーブルを最大 10 まで出力します。ユーザーが数値として 5 を入力したとすると、プログラムの出力は次のようになります。

Enter a Number:
5
5 X 1 = 5
5 X 2 = 10
5 X 3 = 15
5 X 4 = 20
5 X 5 = 25
5 X 6 = 30
5 X 7 = 35
5 X 8 = 40
5 X 9 = 45
5 X 10 = 50

Bash Foreach/For-in スタイル構文

このタイプの for ループは、値/要素のリストを予期し、リスト内の要素ごとに 1 回の反復を実行します。リストは、各項目を 1つのスペースで区切ることで提供できます。または、範囲を指定することもできます。

for Counter in 1 2 3 4 5 .. N
do
	1st statement
	2nd statement
	nth statement
done

例:Hello World を 5 回出力します。

#!/bin/bash
for c in 1 2 4 5 6 
do
   echo "$c Hello World"
done

出力:

1 Hello World
2 Hello World
4 Hello World
5 Hello World
6 Hello World

欠落している 3 に注意してください。ループはリストに指定されたアイテムの数だけ繰り返されるため、この数は失われます。したがって、変数 c には最初に値 1 が割り当てられ、1 回の反復が実行されます。

その後、2 が c に割り当てられ、2 回目の反復が実行されます。後で、リストのすぐ次の値(つまり、4)が c に割り当てられ、リスト全体が終了するまでプロセスが続行されます。

注
上記のリストの項目は、さまざまなファイルの名前にすることができます。さらに、スペースで区切られたアイテムの代わりに、bash コマンドまたは配列から生じる可能性があります。
for Item in File_0 File_1 File_N
do
	Some Operations on Item
done

また

for Item in $(Command)
do
	Some Operations on Item    
done

for ループでコマンドを使用すると、Item 変数に各出力トークンが 1つずつ割り当てられます。たとえば、次のスクリプトは、for ループを使用して、現在のディレクトリの f で始まるすべてのファイルまたはフォルダを出力します。

#!/bin/bash
for Item in $(ls f*)
do
   echo "$Item"
done

Bash for ループでの範囲とジャンプサイズの定義

一部の開始値と終了値の間に欠落している数値がないことがわかっている場合。ジャンプサイズとも呼ばれる 2つの連続する値の差が 1 より大きい場合でも、次の構文で for ループを使用できます。

for i in {Start_Value..End_Value..Jump_Size}
  do 
     Statement(s)
 done

例:10 から 20 までのすべての偶数を出力するには、Start_Value=10、End_Value=20、および Jump_Size=2 が必要です。

#!/bin/bash
for evenNumber in {10..20..2}
  do 
     echo "$evenNumber"
 done

出力:

10
12
14
16
18
20

Bash プロンプトで for ループを作成し、セミコロンを区切ることで問題に対処する ;

; 1 行でコマンドを区切るか終了するために使用されます。&などの他の区切り文字もあります。

ただし、; コマンドを終了するために使用されます。次のコマンドは、前のコマンドが完全に実行された後にのみ実行されます。これは同期実行とも呼ばれます。

ステートメントターミネータとして newline を使用せずに、bash プロンプトの 1 行に for ループを記述したい場合は、Bash リファレンスマニュアルから抜粋した次の構文を使用できます。

for Item [ [in [List of Items] ] ; ] do commands; done

例:次のコードは、偶数を出力するための以前のスクリプトと同等です。

#!/bin/bash
for even in {10..20..2} ; do echo "$even";done
注
コマンドは do キーワードの直後にあることに注意してください。したがって、; を追加します do の後に構文エラーが生成されます。

3 式または C タイプの for ループの構文は次のとおりです。

for (( Initilization ; Condition ; Increment/Decrement )) ; do commands ; done

例:

#!/bin/bash
for ((i=10;i<20;i=i+2));do echo "$i"; done