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





