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

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

重要なポイント

  • Bash for ループは、数値、単語、配列、コマンド ライン変数、または他のコマンドの出力を操作できる多用途ツールです。
  • シンプルな for ループは数値リストまたは単語リストで使用でき、リスト内の値ごとにコードのセクションを繰り返すことができます。
  • for ループは、数値範囲、ファイル名、コマンド ライン パラメーター、単語配列、および連想配列とともに使用することもできるため、タスクのスクリプト作成に柔軟性が得られます。

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

for ループ

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

Bashforループは非常に柔軟です。数値、単語、配列、コマンド ライン変数、または他のコマンドの出力を操作できます。これらはループのヘッダーで使用されます。ヘッダーは、ループが何を扱うか (数値や文字列など)、およびループを停止する終了条件が何であるかを示します。

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

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

シンプルな for ループ

初めての for ループを作成する場合は、これらの簡単な例から始めることができます。

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

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

for i in 1 2 3 4 5; do echo $i; done

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

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

この数値のリストは 3 から始まり、2 ずつ増加し、その後任意に 44 までジャンプします。

for i in 3 5 7 9 11 44; do echo $i; done

非連続の数値リストをカウントする for ループ

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

また、数値は昇順である必要もありません。順序は任意です。

for i in 3 43 44 11 9; do echo $i; done

ソートされていない数値リストをカウントする for ループ

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

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

#!/bin/bashfor word in This is a sequence of wordsdo echo $worddone

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

chmod +x word-list.sh

chmod を使用してスクリプトを実行可能にする

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

./word-list.sh

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

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

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

ループを 100 回実行したい場合、forループ ヘッダーに 100 個の数値を入力する必要があるのは、非常に面倒な作業です。番号範囲では、最初と最後の番号のみを指定できます。

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

#!/bin/bashfor i in {1..10}do echo "Loop spin:" $idone

数値範囲は、範囲の開始と終了の数値を区切る{}2 つのピリオド ” ” を含む中括弧 ” ” 内で定義されます。..範囲定義には空白が含まれていないことを確認してください。

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

./number-range.sh

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

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

#!/bin/bashfor i in {0..32..4}do echo "Loop spin:" $idone

反復子は、数値範囲を 4 つのジャンプでステップ実行します。

./number-range2.sh

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

ファイル名を使用した 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

ファイル名のリストを使用した for ループ

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

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

#!/bin/bashfor file in *.shdo ls -lh "$file"done

これが出力です。

./filenames2.sh

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

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

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

これが「filenames3.sh」です。

#!/bin/bashfor file in $*do ls -lh "$file"done

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

./filenames3.sh n*.sh

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

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

./filenames3.sh n*.sh. bashrc

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

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

C 風の for ループ

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

  • ループ反復子の初期値。
  • ループが継続するか終了するかをテストします。
  • イテレータの増加 (または減少)。

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

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

#!/bin/bashfor ((i=1; i<=10; i++))do echo "Loop number:" $idone

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

./c-like.sh

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

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

逆方向にカウントする C のような for ループ

無限 for ループ

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

#!/bin/bashfor ((; ;))do echo "Press Ctrl+C to stop..." sleep 1done

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

./infinite.sh

C に似た無限の for ループ

ワード配列を使用した for ループ

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

#!/bin/bashdistributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")for distro in $distributionsdo echo $distrodone

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

./word-array.sh

ワード配列を使用した for ループ

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

continue コマンドにより、for ループが単語配列内のエントリをスキップする

ブレークコマンド

コマンド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 ループは、break コマンドのためにそれ以降の処理を放棄します。

連想配列を使用した 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 ループを使用して連想配列から項目を抽出する

コマンドの出力を反復処理する

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

このスクリプトは「command.sh」です。スクリプト ファイル名とその行数、ワード数、バイト数のソートされたリストを提供するためにlsと を使用しますwc

#!/bin/bashfor i in $(ls *.sh | sort);do echo $(wc $i)done

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

./command.sh

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

眩しい for ループ

ループforは多用途で理解しやすいスクリプト ツールです。ただし、柔軟性がある一方で、他のループには理由があって存在することを忘れないでください。for必要なのはループだけだと考えすぎないでください。

whileたとえば、ファイルからの行の読み取りforなど、特定の用途にはループよりもループの方が適しています。

優れたスクリプトを書くということは、目の前のタスクに最適なツールを使用することを意味します。ループforは、トリックのツールボックスに入れておくと便利なツールです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です