Linux Bash スクリプトの for ループの 9 つの例

公開: 2022-08-19
青い背景上のラップトップの Linux コマンド ライン。
Fatmawati achmad zaenuri/Shutterstock.com

用途の広い Bash for loop は、設定された回数ループするだけではありません。 独自の Linux スクリプトでそれらをうまく使用できるように、その多くのバリアントについて説明します。

for ループ

すべてのスクリプト言語とプログラミング言語には、ループを処理する何らかの方法があります。 ループは、繰り返し実行したいコードのセクションです。 スクリプトに同じ一連の命令を何度も入力するのではなく、ループによってコードの 1 つのセクションが何度も繰り返されます。

Linux を使い始めるための 9 つの Bash スクリプトの例
関連9 Linux を使い始めるための Bash スクリプトの例

Bash forループは非常に柔軟です。 数値、単語、配列、コマンド ライン変数、または他のコマンドの出力を処理できます。 これらはループのヘッダーで使用されます。 ヘッダーは、ループが何を処理するか (数値や文字列など) と、ループを停止する終了条件を指定します。

ループの本体には、繰り返したいコードが含まれています。 ループで何をしたいかを保持します。 ループ本体には、有効なスクリプト コマンドを含めることができます。

ループ カウンターまたは反復子と呼ばれる変数は、値の範囲またはデータ項目のリストをステップ実行するために使用されます。 ループごとに、反復子は次の数値、文字列、またはループが反復するデータ型の値を取ります。 これにより、ループは各データ項目の値を順番に処理したり、場合によってはデータ項目自体を操作したりできます。

シンプル for ループ

初めて for ループを作成する場合は、これらの簡単な例を参考にしてください。

数値リストを使用した for ループ

コマンド ラインでforループを実行できます。 このコマンドは、単純なforループを作成して実行します。 イテレータはiという変数です。 順番に、数字のリストの各値にiを割り当てます。 ループの本体は、その値を端末ウィンドウに出力します。 このループが終了する条件は、 iが数値のリスト全体を反復処理したときです。

 1 2 3 4 5 の i の場合。 do echo $i; 終わり

1 から 5 までの for ループ カウント

ここで、変数iはループがスピンするたびに 1 ずつ増加することに注意することが重要ですが、これは数値のリストが毎回 1 ずつ増加するためです。

この数字のリストは 3 から始まり、2 ずつ増えていき、任意に 44 に跳ね上がります。

 3 5 7 9 11 44​​ の i の場合。 do echo $i; 終わり

連続していない数字のリストによる for ループのカウント

forループとの違いはありません。 リストの一方の端から開始し、リスト内のすべての値が使用されるまで、各値を順番に使用します。

また、数値が昇順である必要もありません。 それらは任意の順序にすることができます。

 私は3 43 44 11 9で; do echo $i; 終わり

番号のソートされていないリストをカウントする for ループ

単語リストを使用した for ループ

言葉でも同じことが簡単にできます。 スクリプトのテキストをエディターにコピーし、「word-list.sh」として保存します。

 #!/ビン/バッシュ

for word in これは一連の単語です
行う 
  $単語をエコー
終わり

スクリプトを実行可能にするためにchmodを使用する必要があります。また、この記事からコピーしたその他のスクリプトも必要です。 chmodコマンドを使用するたびに、スクリプトの名前を置き換えるだけです。

 chmod +x word-list.sh 

chmod でスクリプトを実行可能にする

スクリプトを実行してみましょう。

 ./単語リスト.sh 

単語のリストを処理する for ループ

数値の場合と同様に、反復子 (この例では変数word ) は、リストの最後に到達するまでデータ項目のリストを処理します。 ループ本体はword変数の値にアクセスするため、リスト内の各単語が処理されます。

数値範囲のある for ループ

forループを 100 回実行したい場合、ループ ヘッダーに一連の 100 個の数字を入力しなければならないのはかなり面倒です。 番号範囲では、最初と最後の番号のみを指定できます。

このスクリプトは「number-range.sh」です。

 #!/ビン/バッシュ

{1..10} の i について
行う
  echo "ループスピン:" $i
終わり

数値範囲は、範囲の開始と終了の数値を区切る 2 つのピリオド「 .. 」を使用して中括弧「 {} 」内で定義されます。 範囲定義に空白を含めないようにしてください。

実行方法は次のとおりです。

 ./number-range.sh 

数値範囲を使用した for ループ

反復子が範囲内の数値をウォークスルーするために使用するステップ サイズを定義する別の数値を含めることができます。 このスクリプト「number-range2.sh」は、0 ~ 32 の範囲と 4 のステップ サイズを使用します。

 #!/ビン/バッシュ

{0..32..4} の i について
行う
  echo "ループスピン:" $i
終わり

イテレータは、数値範囲を 4 ずつジャンプします。

 ./number-range2.sh 

反復子ステップ 4 を使用する for ループ

ファイル名を使用した for ループ

単語のリストを処理できるため、スクリプトでファイル名を処理できます。 このスクリプトは「filenames.sh」と呼ばれます。

 #!/ビン/バッシュ

word-list.sh のファイルの場合 number-range.sh number-range2.sh filenames.sh
行う
  ls -lh "$ファイル"
終わり

lsが実行できることだけを実行するスクリプトを作成しても意味がありませんが、ループ本体内でファイル名にアクセスする方法を示しています。

 ./filenames.sh 

ファイル名のリストを使用する for ループ

番号範囲を使用する場合と同様に、ループ ヘッダーでファイル パターンを使用して、処理するファイルを指定できます。 これにより、多くの入力が回避され、ファイルの名前を事前に知る必要がなくなります。

このスクリプトは「filenames2.sh」と呼ばれます。 ファイル名のリストをファイル名パターン「*.sh」に置き換えて、スクリプトが現在のディレクトリ内のすべてのスクリプト ファイルをレポートするようにしました。

 #!/ビン/バッシュ

*.sh のファイルの場合
行う
  ls -lh "$ファイル"
終わり

これが出力です。

 ./filenames2.sh 

*.sh のファイル パターンを使用した for ループ

コマンド ライン パラメーターを使用した for ループ

コマンド ラインでファイル名パターンを渡すことで、さらに柔軟性を高めることができます。 $*変数は、スクリプトに渡されるすべてのコマンド ライン パラメータを表します。

これが「filenames3.sh」です。

 #!/ビン/バッシュ

$* のファイル
行う
  ls -lh "$ファイル"
終わり

「n」で始まり、SH 拡張子を持つファイル名を要求します。

 ./filenames3.sh n*.sh 

コマンド ライン パラメータとしてファイル パターンを使用する for ループ

一度に複数のパターンを渡すこともできます。

 ./filenames3.sh n*.sh .bashrc 

ファイル パターンとファイル名のコマンド ライン パラメータを受け取る for ループ

イテレータ変数fileは、各コマンド ライン パラメータの値を取ります。 ファイル名のパターンが展開され、すべてのファイル名がループ本体で処理されます。

関連: Bash で変数を操作する方法

C ライクな for ループ

Bash は、C プログラミング言語に見られるような古典的な 3 項 for ループをサポートしています。 ループ ヘッダーに 3 つの項があるため、これらは 3 項 for ループと呼ばれます。

  • ループ反復子の初期値。
  • ループが継続するか終了するかのテスト。
  • イテレータのインクリメント (またはデクリメント)。

このスクリプトは「c-like.sh」です。

イテレータIはループの開始時に 1 に設定され、ステートメント「 i<=10 」が true である限りループが実行されます。 iが 11 に達するとすぐに、 forループは停止します。 イテレータは、ループの回転ごとに 1 ずつ増加しています。

 #!/ビン/バッシュ

for (( i=1; i<=10; i++ ))
行う 
  echo "ループ番号:" $i
終わり

このスクリプトを実行してみましょう。

 ./c-like.sh 

3 項または C のような for ループ

C ライクなforループにより、少し変わった要件を持つforループを簡単に作成できます。 このループは 15 から始まり、3 ずつ逆方向にカウントされます。これが「c-like2.sh」です。

 #!/ビン/バッシュ

for (( i=15; i>0; i-=3 ))
行う 
  echo "ループ番号:" $i
終わり

実行すると、3 段階で後方にジャンプするはずです。

 ./c-like2.sh 

逆方向にカウントする C ライクな for ループ

ループの無限

この形式のforループを使用して、無限ループを作成することもできます。 次のように、ループ ヘッダーからすべての要素を削除するだけです。 これが「infinite.sh」です。

 #!/ビン/バッシュ

為に (( ; ; ))
行う
  echo "停止するには Ctrl+C を押してください..."
  睡眠 1
終わり

ループを停止するには、Ctrl+C を押す必要があります。

 ./infinite.sh 

C に似た無限の for ループ

Word 配列を使用した for ループ

単語の配列を簡単に反復処理できます。 ループ ヘッダーに配列の名前を指定する必要があり、反復子は配列内のすべてのエントリを処理します。 これが「word-array.sh」です。

 #!/ビン/バッシュ

distributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")

$distributions のディストリビューション用
行う
  エコー $ディストリビューション
終わり

すべてのディストリビューションがリストされています。

 ./word-array.sh 

単語配列を使用した for ループ

継続コマンド

ループで特定のエントリをステップオーバーする場合は、反復子がそのエントリに一致するかどうかをテストし、 continueコマンドを使用します。 continueコマンドは、ループの現在のスピンを放棄します。 イテレータをインクリメントし、ループの次のスピンを開始します — スキップしたいエントリがリストの最後の項目ではないと仮定します。

これが「word-array2.sh」です。 「Arch」配列エントリをステップオーバーしますが、他のすべての配列メンバーを処理します。

 #!/ビン/バッシュ

distributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")

$distributions のディストリビューション用
行う
  if [[ "$distro" == "アーチ" ]] ;
    それから
    継続する
  フィ
  エコー $ディストリビューション
終わり

ターミナル ウィンドウに「Arch」が表示されません。

 ./word-array2.sh 

continue コマンドが原因で、for ループが単語配列内のエントリをスキップしています

ブレーク コマンド

breakコマンドはループから抜け出し、それ以上の処理を防ぎます。

これが「word-array3.sh」です。 continuebreakに置き換えた前のスクリプトと同じです。

 #!/ビン/バッシュ

distributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")

$distributions のディストリビューション用
行う
  if [[ "$distro" == "アーチ" ]] ;
    それから
    壊す
  フィ
  エコー $ディストリビューション
終わり

イテレータに「Arch」が含まれている場合、for ループはそれ以上の処理を放棄します。

 ./word-array3.sh 

break コマンドにより、以降の処理を放棄する for ループ

連想配列を使用した for ループ

Bash 4 以降では、連想配列を使用して、キーまたは値で検索できるキーと値のペアのリストを作成できます。 キーと値の間には双方向の関係があるため、データ ディクショナリとも呼ばれます。

Linux の Bash 辞書とは何ですか? また、それらをどのように使用しますか?
関連Linux の Bash 辞書とは何ですか? また、どのように使用しますか?

forループを使用して、連想配列を反復処理できます。 このスクリプトは「associative.sh」です。 「dog」、「cat」、「robin」、「human」のそれぞれに 1 つずつ、4 つのエントリを持つ連想配列を定義します。 これらが鍵です。 値は、それぞれが持つ (既定の) 脚の数です。

 #!/ビン/バッシュ

宣言 -A 動物 =( [犬]=4 本足 [猫]=4 本足 [コマドリ]=2 本足 [人間]=2 本足 )

${!animals[@]} の脚用
行う
  if [ ${animals[$legs]} == "二本足" ]; それから 
    echo ${legs}
  フィ
終わり

イテレータはlegsと呼ばれます。 ループ ヘッダーには「 ! " 感嘆符。 これは、論理 NOT 演算子として機能するのではなく、連想配列構文の一部です。 配列を検索する必要があります。

ループの本体は、文字列比較テストを実行します。 配列メンバーの値が「Two-legged」の場合、キーの値がターミナル ウィンドウに出力されます。 これを実行すると、スクリプトは 2 本足の生き物を出力します。

 ./associative.sh 

for ループを使用して連想配列からアイテムを抽出する

コマンドの出力を繰り返す

ファイル名など、何かのリストを生成するコマンドまたは一連のコマンドがある場合は、 forループを使用してそれらを反復処理できます。 予期しないファイル名の展開に注意する必要がありますが、単純なケースでは問題ありません。

このスクリプトは「command.sh」です。 lswcを使用して、スクリプト ファイル名の並べ替えられたリストを、それらの行数、単語数、およびバイト数と共に提供します。

 #!/ビン/バッシュ

for i in $(ls *.sh | sort);
行う 
  echo $(wc $i)
終わり

これを実行すると、各ファイルの統計が取得され、ファイルがアルファベット順にリストされます。

 ./command.sh 

for ループを使用して、2 つのパイプ コマンドの出力を反復処理する

見事な for ループ

forループは、用途が広く、理解しやすいスクリプト ツールです。 しかし、柔軟性はあるものの、別のループが存在することを忘れないでください。 forループだけで十分だなどと思い込まないでください。

Linux Bash スクリプトでファイルを 1 行ずつ処理する方法
関連Linux Bash スクリプトでファイルを 1 行ずつ処理する方法

たとえば、 whileループは、ファイルから行を読み取るなど、 forループよりもはるかに適しています。

優れたスクリプトを作成するということは、目の前のタスクに最適なツールを使用するということです。 forループは、トリックのツールボックスに入れるのに最適なツールです。