Linux Bash スクリプトの for ループの 9 つの例
重要なポイント
- Bash for ループは、数値、単語、配列、コマンド ライン変数、または他のコマンドの出力を操作できる多用途ツールです。
- シンプルな for ループは数値リストまたは単語リストで使用でき、リスト内の値ごとにコードのセクションを繰り返すことができます。
- for ループは、数値範囲、ファイル名、コマンド ライン パラメーター、単語配列、および連想配列とともに使用することもできるため、タスクのスクリプト作成に柔軟性が得られます。
多用途の Bashfor
ループは、設定された回数だけループするだけではありません。独自の Linux スクリプトでそれらを正常に使用できるように、その多くのバリアントについて説明します。
for ループ
すべてのスクリプト言語とプログラミング言語には、ループを処理する何らかの方法があります。ループとは、繰り返し実行するコードのセクションです。同じ一連の命令をスクリプトに何度も入力するのではなく、ループによってコードの 1 つのセクションが何度も繰り返されます。
Bashfor
ループは非常に柔軟です。数値、単語、配列、コマンド ライン変数、または他のコマンドの出力を操作できます。これらはループのヘッダーで使用されます。ヘッダーは、ループが何を扱うか (数値や文字列など)、およびループを停止する終了条件が何であるかを示します。
ループの本体には、繰り返したいコードが含まれています。ループに実行させたい内容を保持します。ループ本体には、任意の有効なスクリプト コマンドを含めることができます。
ループ カウンターまたはイテレータと呼ばれる変数は、値の範囲またはデータ項目のリストをステップ実行するために使用されます。ループごとに、反復子は、ループが反復処理する次の数値、文字列、またはその他のデータ型の値を受け取ります。これにより、ループが各データ項目の値を順番に操作したり、場合によってはデータ項目自体を操作したりできるようになります。
シンプルな for ループ
初めての for ループを作成する場合は、これらの簡単な例から始めることができます。
数値リストを使用した for ループ
for
コマンドラインでループを実行できます。このコマンドは、単純なループを作成して実行しますfor
。イテレータは という変数ですi
。i
数値リスト内の各値を順番に割り当てていきます。ループの本体は、その値を端末ウィンドウに出力します。このループを終了する条件は、 がi
数値のリスト全体にわたって反復されたときです。
for i in 1 2 3 4 5; do echo $i; done
ここで、ループが回転するたびに変数がi
1 ずつ増加することに注意することが重要ですが、これは数値のリストが毎回 1 ずつ増加するためです。
この数値のリストは 3 から始まり、2 ずつ増加し、その後任意に 44 までジャンプします。
for i in 3 5 7 9 11 44; do echo $i; done
ループには何の違いもありませんfor
。リストの一方の端から開始し、リスト内のすべての値が使用されるまで、各値を順番に使用します。
また、数値は昇順である必要もありません。順序は任意です。
for i in 3 43 44 11 9; do echo $i; done
単語リストを使用した for ループ
同じことを言葉でも簡単に行うことができます。スクリプトのテキストをエディタにコピーし、「word-list.sh」として保存します。
#!/bin/bashfor word in This is a sequence of wordsdo echo $worddone
chmod
スクリプトを実行可能にするために使用する必要があり、この記事からコピーした他のスクリプトもすべて使用する必要があります。コマンドを使用するたびに、スクリプトの名前を置き換えるだけですchmod
。
chmod +x word-list.sh
スクリプトを実行してみましょう。
./word-list.sh
数値の場合と同様に、反復子 (この例では変数) は、word
リストの最後に到達するまでデータ項目のリストを処理します。ループ本体は変数内の値にアクセスしword
、リスト内の各単語が処理されます。
数値範囲を使用した for ループ
ループを 100 回実行したい場合、for
ループ ヘッダーに 100 個の数値を入力する必要があるのは、非常に面倒な作業です。番号範囲では、最初と最後の番号のみを指定できます。
このスクリプトは「number-range.sh」です。
#!/bin/bashfor i in {1..10}do echo "Loop spin:" $idone
数値範囲は、範囲の開始と終了の数値を区切る{}
2 つのピリオド ” ” を含む中括弧 ” ” 内で定義されます。..
範囲定義には空白が含まれていないことを確認してください。
実行方法は次のとおりです。
./number-range.sh
反復子が範囲内の数値をたどるのに使用するステップ サイズを定義する別の数値を含めることができます。このスクリプト「number-range2.sh」は、0 ~ 32 の範囲と 4 のステップ サイズを使用します。
#!/bin/bashfor i in {0..32..4}do echo "Loop spin:" $idone
反復子は、数値範囲を 4 つのジャンプでステップ実行します。
./number-range2.sh
ファイル名を使用した for ループ
単語のリストを処理できるため、スクリプトをファイル名で動作させることができます。このスクリプトは「filenames.sh」と呼ばれます。
#!/bin/bashfor file in word-list.sh number-range.sh number-range2.sh filenames.shdo ls -lh "$file"done
できることだけを実行するスクリプトを作成するのはまったく無意味ですls
が、ループ本体内のファイル名にアクセスする方法を示しています。
./filenames.sh
番号範囲を使用するのと同様の方法で、ループ ヘッダーでファイル パターンを使用して、処理するファイルを指定できます。これにより、多くの入力が不要になり、ファイルの名前を事前に知っておく必要がなくなります。
このスクリプトは「filenames2.sh」と呼ばれます。現在のディレクトリ内のすべてのスクリプト ファイルについてスクリプトがレポートするように、ファイル名のリストをファイル名パターン「*.sh」に置き換えました。
#!/bin/bashfor file in *.shdo ls -lh "$file"done
これが出力です。
./filenames2.sh
コマンドラインパラメータを使用した for ループ
コマンドラインでファイル名パターンを渡すことで、柔軟性をさらに高めることができます。この$*
変数は、スクリプトに渡されるすべてのコマンド ライン パラメーターを表します。
これが「filenames3.sh」です。
#!/bin/bashfor file in $*do ls -lh "$file"done
「n」で始まり、SH 拡張子を持つファイル名を求めます。
./filenames3.sh n*.sh
一度に複数のパターンを渡すこともできます。
./filenames3.sh n*.sh. bashrc
イテレータ変数は、file
各コマンド ライン パラメータの値を受け取ります。ファイル名パターンが展開され、すべてのファイル名がループ本体で処理されます。
C 風の for ループ
Bash は、C プログラミング言語で見られるような、古典的な 3 項の for ループをサポートしています。ループ ヘッダーに 3 つの項があるため、これらは 3 項 for ループと呼ばれます。
- ループ反復子の初期値。
- ループが継続するか終了するかをテストします。
- イテレータの増加 (または減少)。
このスクリプトは「c-like.sh」です。
反復子はループの開始時に 1 に設定され、ステートメント「 」が true でI
ある限りループは実行されます。11 に達するi<=10
とすぐにループが停止します。イテレータは、ループが 1 回転するたびに 1 つずつ増加します。i
for
#!/bin/bashfor ((i=1; i<=10; i++))do echo "Loop number:" $idone
このスクリプトを実行してみましょう。
./c-like.sh
C に似たループを使用すると、少し変わった要件を持つループをfor
簡単に作成できます。for
このループは 15 から始まり、3 ずつ逆方向にカウントします。これは「c-like2.sh」です。
#!/bin/bashfor ((i=15; i>0; i-=3))do echo "Loop number:" $idone
実行すると、3 段階ずつ後方にジャンプするはずです。
./c-like2.sh
無限 for ループ
この形式のfor
ループを使用して無限ループを作成することもできます。次のように、ループ ヘッダーからすべての要素を削除するだけです。これが「infinite.sh」です。
#!/bin/bashfor ((; ;))do echo "Press Ctrl+C to stop..." sleep 1done
ループを停止するには、Ctrl+C を押す必要があります。
./infinite.sh
ワード配列を使用した for ループ
単語の配列を簡単に反復処理できます。ループ ヘッダーに配列の名前を指定する必要があります。反復子は配列内のすべてのエントリを調べます。これが「word-array.sh」です。
#!/bin/bashdistributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")for distro in $distributionsdo echo $distrodone
すべてのディストリビューションがリストされています。
./word-array.sh
continueコマンド
ループで特定のエントリをステップオーバーする場合は、反復子がそのエントリと一致するかどうかをテストし、 コマンドを使用しますcontinue
。このcontinue
コマンドは、ループの現在のスピンを放棄します。これはイテレータをインクリメントし、ループの次のスピンを開始します。ただし、スキップするエントリがリストの最後の項目ではないと仮定します。
これは「word-array2.sh」です。「Arch」配列エントリをステップオーバーしますが、他のすべての配列メンバーを処理します。
#!/bin/bashdistributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")for distro in $distributionsdo if [[ "$distro" == "Arch" ]] ; then continue fi echo $distrodone
ターミナルウィンドウに「Arch」が表示されません。
./word-array2.sh
ブレークコマンド
コマンドbreak
はループから抜け出し、それ以上の処理を防ぎます。
continue
これは「word-array3.sh」です。先ほどのスクリプトを に置き換えたものと同じですbreak
。
#!/bin/bashdistributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")for distro in $distributionsdo if [[ "$distro" == "Arch" ]] ; then break fi echo $distrodone
イテレータに「Arch」が含まれる場合、for ループはそれ以上の処理を放棄します。
./word-array3.sh
連想配列を使用した for ループ
Bash 4 以降では、連想配列を使用して、キーまたは値で検索できるキーと値のペアのリストを作成できます。キーと値の間には双方向の関係があるため、これらはデータ ディクショナリとも呼ばれます。
ループを使用して連想配列を反復処理できますfor
。このスクリプトは「associative.sh」です。このスクリプトは、「dog」、「cat」、「robin」、および「human」をそれぞれ 1 つずつ含む 4 つのエントリを含む連想配列を定義します。これらがキーです。値は、それぞれが持つレッグの (デフォルト) 数です。
#!/bin/bashdeclare -A animals=([dog]=Four-legged [cat]=Four-legged [robin]=Two-legged [human]=Two-legged)for legs in ${!animals[@]}do if [ ${animals[$legs]} == "Two-legged" ]; then echo ${legs} fidone
反復子は と呼ばれますlegs
。ループヘッダーには「!
」感嘆符が含まれていることに注意してください。これは論理 NOT 演算子として機能するのではなく、連想配列構文の一部です。配列全体を検索する必要があります。
ループの本体は文字列比較テストを実行します。配列メンバーの値が「Two-legged」の場合、キーの値が端末ウィンドウに出力されます。スクリプトを実行すると、二本足の生き物が出力されます。
./associative.sh
コマンドの出力を反復処理する
ファイル名などのリストを生成するコマンドまたは一連のコマンドがある場合は、ループを使用してそれらを反復処理できますfor
。予期しないファイル名の拡張に注意する必要がありますが、単純な場合は問題ありません。
このスクリプトは「command.sh」です。スクリプト ファイル名とその行数、ワード数、バイト数のソートされたリストを提供するためにls
と を使用しますwc
。
#!/bin/bashfor i in $(ls *.sh | sort);do echo $(wc $i)done
これを実行すると、各ファイルの統計が取得され、ファイルがアルファベット順にリストされます。
./command.sh
眩しい for ループ
ループfor
は多用途で理解しやすいスクリプト ツールです。ただし、柔軟性がある一方で、他のループには理由があって存在することを忘れないでください。for
必要なのはループだけだと考えすぎないでください。
while
たとえば、ファイルからの行の読み取りfor
など、特定の用途にはループよりもループの方が適しています。
優れたスクリプトを書くということは、目の前のタスクに最適なツールを使用することを意味します。ループfor
は、トリックのツールボックスに入れておくと便利なツールです。
コメントを残す