Linux Bash スクリプトの for ループの 9 つの例
公開: 2022-08-19 用途の広い Bash for
loop は、設定された回数ループするだけではありません。 独自の Linux スクリプトでそれらをうまく使用できるように、その多くのバリアントについて説明します。
for ループ
すべてのスクリプト言語とプログラミング言語には、ループを処理する何らかの方法があります。 ループは、繰り返し実行したいコードのセクションです。 スクリプトに同じ一連の命令を何度も入力するのではなく、ループによってコードの 1 つのセクションが何度も繰り返されます。
Bash for
ループは非常に柔軟です。 数値、単語、配列、コマンド ライン変数、または他のコマンドの出力を処理できます。 これらはループのヘッダーで使用されます。 ヘッダーは、ループが何を処理するか (数値や文字列など) と、ループを停止する終了条件を指定します。
ループの本体には、繰り返したいコードが含まれています。 ループで何をしたいかを保持します。 ループ本体には、有効なスクリプト コマンドを含めることができます。
ループ カウンターまたは反復子と呼ばれる変数は、値の範囲またはデータ項目のリストをステップ実行するために使用されます。 ループごとに、反復子は次の数値、文字列、またはループが反復するデータ型の値を取ります。 これにより、ループは各データ項目の値を順番に処理したり、場合によってはデータ項目自体を操作したりできます。
シンプル for ループ
初めて for ループを作成する場合は、これらの簡単な例を参考にしてください。
数値リストを使用した for ループ
コマンド ラインでfor
ループを実行できます。 このコマンドは、単純なfor
ループを作成して実行します。 イテレータはi
という変数です。 順番に、数字のリストの各値にi
を割り当てます。 ループの本体は、その値を端末ウィンドウに出力します。 このループが終了する条件は、 i
が数値のリスト全体を反復処理したときです。
1 2 3 4 5 の i の場合。 do echo $i; 終わり
ここで、変数i
はループがスピンするたびに 1 ずつ増加することに注意することが重要ですが、これは数値のリストが毎回 1 ずつ増加するためです。
この数字のリストは 3 から始まり、2 ずつ増えていき、任意に 44 に跳ね上がります。
3 5 7 9 11 44 の i の場合。 do echo $i; 終わり
for
ループとの違いはありません。 リストの一方の端から開始し、リスト内のすべての値が使用されるまで、各値を順番に使用します。
また、数値が昇順である必要もありません。 それらは任意の順序にすることができます。
私は3 43 44 11 9で; do echo $i; 終わり
単語リストを使用した for ループ
言葉でも同じことが簡単にできます。 スクリプトのテキストをエディターにコピーし、「word-list.sh」として保存します。
#!/ビン/バッシュ for word in これは一連の単語です 行う $単語をエコー 終わり
スクリプトを実行可能にするためにchmod
を使用する必要があります。また、この記事からコピーしたその他のスクリプトも必要です。 chmod
コマンドを使用するたびに、スクリプトの名前を置き換えるだけです。
chmod +x word-list.sh
スクリプトを実行してみましょう。
./単語リスト.sh
数値の場合と同様に、反復子 (この例では変数word
) は、リストの最後に到達するまでデータ項目のリストを処理します。 ループ本体はword
変数の値にアクセスするため、リスト内の各単語が処理されます。
数値範囲のある for ループ
for
ループを 100 回実行したい場合、ループ ヘッダーに一連の 100 個の数字を入力しなければならないのはかなり面倒です。 番号範囲では、最初と最後の番号のみを指定できます。
このスクリプトは「number-range.sh」です。
#!/ビン/バッシュ {1..10} の i について 行う echo "ループスピン:" $i 終わり
数値範囲は、範囲の開始と終了の数値を区切る 2 つのピリオド「 ..
」を使用して中括弧「 {}
」内で定義されます。 範囲定義に空白を含めないようにしてください。
実行方法は次のとおりです。
./number-range.sh
反復子が範囲内の数値をウォークスルーするために使用するステップ サイズを定義する別の数値を含めることができます。 このスクリプト「number-range2.sh」は、0 ~ 32 の範囲と 4 のステップ サイズを使用します。
#!/ビン/バッシュ {0..32..4} の i について 行う echo "ループスピン:" $i 終わり
イテレータは、数値範囲を 4 ずつジャンプします。
./number-range2.sh
ファイル名を使用した for ループ
単語のリストを処理できるため、スクリプトでファイル名を処理できます。 このスクリプトは「filenames.sh」と呼ばれます。
#!/ビン/バッシュ word-list.sh のファイルの場合 number-range.sh number-range2.sh filenames.sh 行う ls -lh "$ファイル" 終わり
ls
が実行できることだけを実行するスクリプトを作成しても意味がありませんが、ループ本体内でファイル名にアクセスする方法を示しています。
./filenames.sh
番号範囲を使用する場合と同様に、ループ ヘッダーでファイル パターンを使用して、処理するファイルを指定できます。 これにより、多くの入力が回避され、ファイルの名前を事前に知る必要がなくなります。
このスクリプトは「filenames2.sh」と呼ばれます。 ファイル名のリストをファイル名パターン「*.sh」に置き換えて、スクリプトが現在のディレクトリ内のすべてのスクリプト ファイルをレポートするようにしました。
#!/ビン/バッシュ *.sh のファイルの場合 行う ls -lh "$ファイル" 終わり
これが出力です。
./filenames2.sh
コマンド ライン パラメーターを使用した for ループ
コマンド ラインでファイル名パターンを渡すことで、さらに柔軟性を高めることができます。 $*
変数は、スクリプトに渡されるすべてのコマンド ライン パラメータを表します。
これが「filenames3.sh」です。
#!/ビン/バッシュ $* のファイル 行う ls -lh "$ファイル" 終わり
「n」で始まり、SH 拡張子を持つファイル名を要求します。
./filenames3.sh n*.sh
一度に複数のパターンを渡すこともできます。
./filenames3.sh n*.sh .bashrc
イテレータ変数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
C ライクなfor
ループにより、少し変わった要件を持つfor
ループを簡単に作成できます。 このループは 15 から始まり、3 ずつ逆方向にカウントされます。これが「c-like2.sh」です。
#!/ビン/バッシュ for (( i=15; i>0; i-=3 )) 行う echo "ループ番号:" $i 終わり
実行すると、3 段階で後方にジャンプするはずです。
./c-like2.sh
ループの無限
この形式のfor
ループを使用して、無限ループを作成することもできます。 次のように、ループ ヘッダーからすべての要素を削除するだけです。 これが「infinite.sh」です。
#!/ビン/バッシュ 為に (( ; ; )) 行う echo "停止するには Ctrl+C を押してください..." 睡眠 1 終わり
ループを停止するには、Ctrl+C を押す必要があります。
./infinite.sh
Word 配列を使用した for ループ
単語の配列を簡単に反復処理できます。 ループ ヘッダーに配列の名前を指定する必要があり、反復子は配列内のすべてのエントリを処理します。 これが「word-array.sh」です。
#!/ビン/バッシュ distributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda") $distributions のディストリビューション用 行う エコー $ディストリビューション 終わり
すべてのディストリビューションがリストされています。
./word-array.sh
継続コマンド
ループで特定のエントリをステップオーバーする場合は、反復子がそのエントリに一致するかどうかをテストし、 continue
コマンドを使用します。 continue
コマンドは、ループの現在のスピンを放棄します。 イテレータをインクリメントし、ループの次のスピンを開始します — スキップしたいエントリがリストの最後の項目ではないと仮定します。
これが「word-array2.sh」です。 「Arch」配列エントリをステップオーバーしますが、他のすべての配列メンバーを処理します。
#!/ビン/バッシュ distributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda") $distributions のディストリビューション用 行う if [[ "$distro" == "アーチ" ]] ; それから 継続する フィ エコー $ディストリビューション 終わり
ターミナル ウィンドウに「Arch」が表示されません。
./word-array2.sh
ブレーク コマンド
break
コマンドはループから抜け出し、それ以上の処理を防ぎます。
これが「word-array3.sh」です。 continue
をbreak
に置き換えた前のスクリプトと同じです。
#!/ビン/バッシュ distributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda") $distributions のディストリビューション用 行う if [[ "$distro" == "アーチ" ]] ; それから 壊す フィ エコー $ディストリビューション 終わり
イテレータに「Arch」が含まれている場合、for ループはそれ以上の処理を放棄します。
./word-array3.sh
連想配列を使用した for ループ
Bash 4 以降では、連想配列を使用して、キーまたは値で検索できるキーと値のペアのリストを作成できます。 キーと値の間には双方向の関係があるため、データ ディクショナリとも呼ばれます。
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
ループを使用してそれらを反復処理できます。 予期しないファイル名の展開に注意する必要がありますが、単純なケースでは問題ありません。
このスクリプトは「command.sh」です。 ls
とwc
を使用して、スクリプト ファイル名の並べ替えられたリストを、それらの行数、単語数、およびバイト数と共に提供します。
#!/ビン/バッシュ for i in $(ls *.sh | sort); 行う echo $(wc $i) 終わり
これを実行すると、各ファイルの統計が取得され、ファイルがアルファベット順にリストされます。
./command.sh
見事な for ループ
for
ループは、用途が広く、理解しやすいスクリプト ツールです。 しかし、柔軟性はあるものの、別のループが存在することを忘れないでください。 for
ループだけで十分だなどと思い込まないでください。
たとえば、 while
ループは、ファイルから行を読み取るなど、 for
ループよりもはるかに適しています。
優れたスクリプトを作成するということは、目の前のタスクに最適なツールを使用するということです。 for
ループは、トリックのツールボックスに入れるのに最適なツールです。