Loop Through Lines of a File: Bash For Loop Explained
Bash スクリプトでファイルの行をループしたいが、その方法の1つは for ループを使用すること。
for ループとは何ですか。
for ループは最も一般的なプログラミング構成の 1 つで、リスト内のアイテムのセットを指定してコードのブロックを実行するために使用されます。 例えば、ヨーロッパの10大都市に住んでいる人の数を表示するプログラムを書きたいとします。
実行されるロジックは毎回同じで、変更されるのは都市だけです。
以下に、Bash の for ループの一般的な構文を示します。
リストの各項目について、doとdoneの間のN個のコマンドが実行される。
Bash での for ループ
この記事では、Bash で for ループを使用する方法、特にファイルの行を通過する方法を学習します。
たとえば、アプリケーションからデータをファイルにエクスポートして、そのデータを何らかの方法で精緻化する必要があるかもしれません。
下にテキストファイルの形式を示しますが、各都市とその都市に住む人の数を区切るのにコロンが使用されています。
まず、ファイルの名前を変数に格納します
FILENAME="european-cities.txt"
その後、別の変数と cat コマンドを使用して、ファイル内のすべての行を取得します:
LINES=$(cat $FILENAME)
ここでは、cat コマンドの出力を LINES 変数に代入するコマンド置換を使用しています。
For ループにより、最終的にファイルの各行を通過することができます:
for LINE in $LINESdo echo "$LINE"done
Do と done は for ループの各反復で実行されるコマンドを定義するために使用します。
例えば、10 行のファイルがある場合、for ループは 10 回繰り返し、各繰り返しでファイルの 1 行を読み込む。
echo コマンドは、ファイルの各行で何をしたいかに基づいて、コマンドの任意のシーケンスに置き換えることができる。
これが最終的なスクリプトです。
#!/bin/bash FILENAME="european-cities.txt"LINES=$(cat $FILENAME)for LINE in $LINESdo echo "$LINE"done
そしてスクリプトの出力は…
./cities.sh Istanbul:15,067,724Moscow:12,615,279London:9,126,366Saint-Petersburg:5,383,890Berlin:3,748,148Kyiv:3,703,100Madrid:3,223,334Rome:2,857,321Paris:2,140,526Bucharest:2,106,144
猫コマンドを使用して、リストを for ループに渡しています。
他に考えられるコマンドはありますか。
また、Bash スクリプトでループを作成するには for ループだけでなく、別のオプションとして while ループがあります。
Bash の For ループにおけるカウンタとは何ですか?
for ループでは、カウンタという変数も定義できます。 カウンターを使用して、ループの各反復を追跡できます。
カウンターの使用は、すべてのプログラミング言語で非常に一般的です。
前のプログラムを修正し、繰り返しごとに値が表示されるカウンターを定義してみましょう。
そして、各反復で、ファイルからの行と一緒にカウンターの値を表示します。
その後、Bash 算術演算子を使用して、変数 COUNTER の値を 1 つ増やします。
そして、これがスクリプトの出力です:
Counter 0: Istanbul:15,067,724Counter 1: Moscow:12,615,279Counter 2: London:9,126,366Counter 3: Saint-Petersburg:5,383,890Counter 4: Berlin:3,748,148Counter 5: Kyiv:3,703,100Counter 6: Madrid:3,223,334Counter 7: Rome:2,857,321Counter 8: Paris:2,140,526Counter 9: Bucharest:2,106,144
Bash For Loop における break と continue
Bash で for ループの通常の流れを変更する方法があります。
これを行うための 2 つのステートメントは break と continue です:
- break: for ループの実行を中断し for ループ後の最初の行にジャンプする。
- continue: for ループの次の繰り返しにジャンプする。
カウンタを定義しておくと、既存のスクリプトに break や continue を追加したときに何が起こるかを確認することができます。 カウンタが 3 に等しい場合、if 内の break 文はループの実行を中断します:
#!/bin/bash FILENAME="european-cities.txt"LINES=$(cat $FILENAME)COUNTER=0for LINE in $LINESdo if ; then break fi echo "Counter $COUNTER: $LINE" COUNTER=$((COUNTER+1))done
そして出力は:
Counter 0: Istanbul:15,067,724Counter 1: Moscow:12,615,279Counter 2: London:9,126,366
このように、counter が 3 なので echo コマンドに達する前に break 文が for ループの実行を停止します.
その後 break を continue と置き換え、どうなるか確認してみましょう. 残りのコードは変更せずにおきます。
#!/bin/bash FILENAME="european-cities.txt"LINES=$(cat $FILENAME)COUNTER=0for LINE in $LINESdo if ; then continue fi echo "Counter $COUNTER: $LINE" COUNTER=$((COUNTER+1))done
そして、このスクリプトの出力です:
Counter 0: Istanbul:15,067,724Counter 1: Moscow:12,615,279Counter 2: London:9,126,366
奇妙なことに…出力は同じです。
それは、COUNTER の値が 3 のとき、continue ステートメントはループの次の反復にジャンプしますが、カウンターの値を増加させないためです。
これを修正するには、if 文の中で COUNTER 変数の値を増やす必要があります:
#!/bin/bash FILENAME="european-cities.txt"LINES=$(cat $FILENAME)COUNTER=0for LINE in $LINESdo if ; then COUNTER=$((COUNTER+1)) continue fi echo "Counter $COUNTER: $LINE" COUNTER=$((COUNTER+1))done
このとき、正しい出力を見ることができます:
Counter 0: Istanbul:15,067,724Counter 1: Moscow:12,615,279Counter 2: London:9,126,366Counter 4: Berlin:3,748,148Counter 5: Kyiv:3,703,100Counter 6: Madrid:3,223,334Counter 7: Rome:2,857,321Counter 8: Paris:2,140,526Counter 9: Bucharest:2,106,144
ご覧のように、ターミナルには “Counter 3: …” は出力されません。
1行でForループを書く
このチュートリアルを終える前に、1行でForループを書く方法を見てみましょう。
これは、コードが読みにくくなることを考えると、推奨できる方法ではありません。
Bash の for ループを 1 行で記述する一般的な構文は次のとおりです:
for i in ; do ; done
Let’s print the content of our text file with a one line for loop:
#!/bin/bashFILENAME="european-cities.txt"LINES=$(cat $FILENAME)for LINE in $LINES; do echo $LINE; done
I have removed the COUNTER and the if statement to simplify things.
Conclusion
結論として、このチュートリアルでは、次の方法を学びました:
- Store the lines of a file in a variable
- Use a for loop to go through each line.If they were there the one line for loop is a much hard to read.
Trying away from one-liner if it makes your code hard to read.
Continue for Loop
Transfer for the line in a single line for Loop.
- forループでカウンタを使う
- breakとcontinueでループの流れを変える
- forループを一行で書く
意味ある?
これをどのように使うのですか?
教えてください 🙂
Bash スクリプトのループについてもっと学びたい場合は、このチュートリアルを見てください。 Bash スクリプトの解読