Shell Scripting - For Loops
目次:
- ループの標準Bash
- 文字列のループ
- 番号範囲でループする
- 配列要素のループ
- CスタイルBash forループ
- ステートメントを中断して続行
- ブレイクステートメント
- 声明を続ける
- Bash Forループの例
- ファイル名にスペースを含むファイルの名前を変更する
- ファイル拡張子の変更
- 結論
ループは、プログラミング言語の基本概念の1つです。 ループは、特定の条件に達するまで一連のコマンドを繰り返し実行する場合に便利です。
Bashなどのスクリプト言語では、繰り返しタスクの自動化にループが役立ちます。
Bashスクリプトには、forループ、whileループ、untilループの3つの基本的なループ構造があります。
このチュートリアルでは、Bashのforループの基本について説明します。 また、breakおよびcontinueステートメントを使用してループのフローを変更する方法も示します。
ループの標準Bash
forループは、アイテムのリストを反復処理し、指定された一連のコマンドを実行します。
Bash forループの形式は次のとおりです。
for item in do done
リストは、スペース、数字の範囲、コマンドの出力、配列などで区切られた一連の文字列にすることができます。
文字列のループ
以下の例では、ループは文字列のリスト内の各アイテムを反復処理し、変数
element
は現在のアイテムに設定されます。
for element in Hydrogen Helium Lithium Beryllium do echo "Element: $element" done
ループは次の出力を生成します。
Element: Hydrogen Element: Helium Element: Lithium Element: Beryllium
番号範囲でループする
範囲の開始点と終了点を定義することにより、シーケンス式を使用して数値または文字の範囲を指定できます。 シーケンス式の形式は次のとおりです。
{START..END}
以下の例では、ループは0から3までのすべての数値を反復処理します。
for i in {0..3} do echo "Number: $i" done
Number: 0 Number: 1 Number: 2 Number: 3
Bash 4以降では、範囲を使用するときに増分を指定することもできます。 式は次の形式を取ります。
{START..END..INCREMENT}
for i in {0..20..5} do echo "Number: $i" done
Number: 0 Number: 5 Number: 10 Number: 15 Number: 20
配列要素のループ
forループを使用して、要素の配列を反復処理することもできます。
以下の例では、配列
BOOKS
を定義し、配列の各要素を繰り返し処理しています。
BOOKS=('In Search of Lost Time' 'Don Quixote' 'Ulysses' 'The Great Gatsby') for book in "${BOOKS}"; do echo "Book: $book" done
Book: In Search of Lost Time Book: Don Quixote Book: Ulysses Book: The Great Gatsby
CスタイルBash forループ
Cスタイルのforループの構文は、次の形式を取ります。
for ((INITIALIZATION; TEST; STEP)) do done
ループの開始時に
INITIALIZATION
部分は1回だけ実行されます。 次に、
TEST
部分が評価されます。 falseの場合、forループは終了します。
TEST
がtrueの場合、forループの本体内のコマンドが実行され、
STEP
部分が更新されます。
次のコードでは、
i = 0
初期化することによりループが開始され、各反復の前にi≤10かどうかがチェックされます。 trueの場合、
i
と
i
現在の値を1
i++
(
i++
)出力します。そうでない場合、ループは終了します。
for ((i = 0; i <= 1000; i++)); do echo "Counter: $i" done
ループは1001回繰り返され、次の出力を生成します。
Counter: 0 Counter: 1 Counter: 2… Counter: 998 Counter: 999 Counter: 1000
ステートメントを中断して続行
breakおよびcontinueステートメントを使用して、forループの実行を制御できます。
ブレイクステートメント
breakステートメントは、現在のループを終了し、プログラム制御を、終了したステートメントに続くステートメントに渡します。 通常、特定の条件が満たされたときにループを終了するために使用されます。
次の例では、ifステートメントを使用して、現在の反復項目が「Lithium」に等しくなったらループの実行を終了します。
for element in Hydrogen Helium Lithium Beryllium; do if]; then break fi echo "Element: $element" done echo 'All Done!'
Element: Hydrogen Element: Helium All Done!
声明を続ける
continueステートメントは、ループの現在の反復を終了し、プログラム制御をループの次の反復に渡します。
次の例では、数値の範囲を反復処理しており、現在の反復項目が「2」に等しい場合、continueステートメントによって実行がループの先頭に戻り、次の反復が続行されます。
for i in {1..5}; do if]; then continue fi echo "Number: $i" done
Number: 1 Number: 3 Number: 4 Number: 5
Bash Forループの例
ファイル名にスペースを含むファイルの名前を変更する
次の例は、Bash forループを使用して、現在のディレクトリ内のすべてのファイルの名前をスペースで置き換えて、スペースをアンダースコアに置き換える方法を示しています。
for file in *\ *; do mv "$file" "${file// /_}" done
コードを行ごとに分解してみましょう。
- 最初の行はforループを作成し、名前にスペースを含むすべてのファイルのリストを反復処理します。 式
*\ *
はリストを作成します。2行目はリストの各項目に適用され、ファイルを新しいものに移動して、スペースをアンダースコア(_
)に置き換えます。 部分${file// /_}
は、シェルパラメーター展開を使用して、パラメーター内のパターンを文字列に置き換えています。done
は、ループセグメントの終わりを示します。
ファイル拡張子の変更
次の例は、Bash forループを使用して、ファイル拡張子を.jpegから.jpgに置き換えることにより、現在のディレクトリ内の.jpegで終わるすべてのファイルの名前を変更する方法を示しています。
for file in *.jpeg; do mv -- "$file" "${file%.jpeg}.jpg" done
コードを行ごとに分析してみましょう。
- 最初の行はforループを作成し、「。jpeg」で終わるすべてのファイルのリストを反復処理します。2行目はリストの各項目に適用され、「。jpeg」を「.jpg」に置き換えて新しいファイルに移動します。
${file%.jpeg}
は、シェルパラメータ展開を使用してファイル名から「.jpeg」部分を削除し、ループセグメントの終わりを示します。
結論
ここまでで、bash forループを使用してリストを反復処理する方法を十分に理解できたはずです。
バッシュループターミナルWindows Phone Mangoアプリケーションの開発、パート7:繰り返し用このWindows Phoneチュートリアルでは、 "forループ"
Windows Phone 7.5 Mangoアプリケーションの開発の一部として、最後のチュートリアルでは、複数の値がある場合に "
Bash:ファイルに追加
Linuxには、ファイルにテキストを追加する方法が複数あります。 この記事ではそれらのいくつかについて説明します。
bash(カウンター)で変数をインクリメントおよびデクリメントする方法
Bashスクリプトを記述するときの最も一般的な算術演算の1つは、変数の増分と減分です。 これは、ループでカウンターとして最もよく使用されますが、スクリプト内の他の場所でも発生する可能性があります。