Linux シェル スクリプト用の 12 の Bash For ループの例
bash for loops には 2 種類あります。 1 つは値のリストで「in」キーワードを使用し、もう 1 つは C プログラミングのような構文を使用します。
この記事は、進行中の bash チュートリアル シリーズの一部です。
これは両方の bash for ループの方法を説明し、シェル スクリプトで bash for ループを使用する方法に関する 12 の異なる例を提供します。ループに bash を使用する方法を例とともに参照する必要はありません。
方法 1:「in」と値のリストを使用した Bash For ループ
構文:
for varname in list do command1 command2 .. done
上記の構文では:
- for、in、do、done がキーワードです
- 「list」には値のリストが含まれます。リストは、スペースで区切られた複数の単語を含む変数にすることができます。 for ステートメントに list がない場合、シェルに渡された位置パラメーターが使用されます。
- varname は任意の Bash 変数名です。
この形式では、for ステートメントは、リスト内の項目ごとに 1 回、本体で囲まれたコマンドを実行します。たとえば、値のリストに 5 つの項目が含まれている場合、for ループはリスト内の項目ごとに 1 回、合計 5 回実行されます。リストの現在の項目は、ループのたびに変数「varname」に格納されます。この「varname」は for ループの本体で処理できます。
方法 2:C のような構文を使用した Bash For ループ
for ループの 2 番目の形式は、「C」プログラミング言語の for ループに似ており、3 つの式 (初期化、条件、および更新) があります。
<センター> センター>for (( expr1; expr2; expr3 )) do command1 command2 .. done
上記のコマンド構文の bash では、
- 最初の繰り返しの前に、expr1 が評価されます。これは通常、ループの変数を初期化するために使用されます。
- do と done の間のすべてのステートメントは、expr2 の値が TRUE になるまで繰り返し実行されます。
- ループの各反復の後、expr3 が評価されます。これは通常、ループ カウンターをインクリメントするために使用されます。
次の 12 の例は、さまざまな方法で for ループを bash する方法を示しています。
1. 「in」キーワードの後のリストの静的値
次の例では、値のリスト (Mon、Tue、Wed、Thu、および Fri) は、bash for ループ内のキーワード「in」の後に直接指定されています。
$ cat for1.sh i=1 for day in Mon Tue Wed Thu Fri do echo "Weekday $((i++)) : $day" done $ ./for1.sh Weekday 1 : Mon Weekday 2 : Tue Weekday 3 : Wed Weekday 4 : Thu Weekday 5 : Fri
注意: 値のリストはコンマで区切らないでください (Mon、Tue、Wed、Thu、Fri)。コンマは値の一部として扱われます。つまり、以下の例に示すように、「Mon」の代わりに「Mon」を値として使用します。
$ cat for1-wrong1.sh i=1 for day in Mon, Tue, Wed, Thu, Fri do echo "Weekday $((i++)) : $day" done $ ./for1-wrong1.sh Weekday 1 : Mon, Weekday 2 : Tue, Weekday 3 : Wed, Weekday 4 : Thu, Weekday 5 : Fri
注意: 値のリストを二重引用符で囲まないでください。 (「月火水木金」)。以下の例に示すように、二重引用符で囲むと、(5 つの異なる値ではなく) 単一の値として扱われます。
$ cat for1-wrong2.sh i=1 for day in "Mon Tue Wed Thu Fri" do echo "Weekday $((i++)) : $day" done $ ./for1-wrong2.sh Weekday 1 : Mon Tue Wed Thu Fri
2. 「in」キーワードの後のリストの変数
次の例に示すように、for ループで値を直接指定する代わりに、値を変数に格納し、for ループで「in」キーワードの後にその変数を使用できます。
$ cat for2.sh i=1 weekdays="Mon Tue Wed Thu Fri" for day in $weekdays do echo "Weekday $((i++)) : $day" done $ ./for2.sh Weekday 1 : Mon Weekday 2 : Tue Weekday 3 : Wed Weekday 4 : Thu Weekday 5 : Fri
注意 :ベスト プラクティスとして、参照するときは常に bash 変数を引用する必要があります。このベスト プラクティス ルールにはいくつかの例外があります。これはそれらの1つです。この for ループで変数を二重引用符で囲むと、値のリストは単一の値として扱われます。多くの人がこの罠に陥ります。 for ループ内で変数を二重引用符にしないように注意してください。
$ cat for2-wrong.sh i=1 weekdays="Mon Tue Wed Thu Fri" for day in "$weekdays" do echo "Weekday $((i++)) : $day" done $ ./for2-wrong.sh Weekday 1 : Mon Tue Wed Thu Fri
3.リストを指定しないでください。位置パラメータから取得
キーワード「in」の後に bash の for ループで値のリストを指定しない場合、位置パラメータ (つまり、シェル スクリプトに渡される引数) が使用されます。
$ cat for3.sh i=1 for day do echo "Weekday $((i++)) : $day" done $ ./for3.sh Mon Tue Wed Thu Fri Weekday 1 : Mon Weekday 2 : Tue Weekday 3 : Wed Weekday 4 : Thu Weekday 5 : Fri
注意: この方法を使用する場合は注意してください。 for ループにキーワード「in」を含めないでください。キーワード「in」を値なしのままにしておくと、以下に示すように位置パラメーターは使用されません。ループには入りません。つまり、以下の例に示すように、for ループは実行されません。
$ cat for3-wrong.sh i=1 for day in do echo "Weekday $((i++)) : $day" done $ ./for3-wrong.sh Mon Tue Wed Thu Fri
注意 :bash の位置パラメータの詳細については、以前の記事を参照してください。
4. 「in」キーワードの後のリスト値としての Unix コマンド出力
以下に示すように、コマンドをバッククォート ` ` で囲むことにより、任意の UNIX / Linux コマンドの出力を値のリストとして for ループに使用できます。
$ cat for4.sh i=1 for username in `awk -F: '{print $1}' /etc/passwd` do echo "Username $((i++)) : $username" done $ ./for4.sh Username 1 : ramesh Username 2 : john Username 3 : preeti Username 4 : jason ..
5. for ループでファイルとディレクトリをループする
特定のディレクトリの下にあるファイルとディレクトリをループするには、cd でそのディレクトリに移動し、以下に示すように for ループで * を指定します。
次の例は、ホーム ディレクトリの下のすべてのファイルとディレクトリをループ処理します。
$ cat for5.sh i=1 cd ~ for item in * do echo "Item $((i++)) : $item" done $ ./for5.sh Item 1 : positional-parameters.sh Item 2 : backup.sh Item 3 : emp-report.awk Item 4 : item-list.sed Item 5 : employee.db Item 8 : storage Item 9 : downloads
bash for ループでの * の使用は、ls コマンド (およびその他のコマンド) を使用するときに Linux コマンド ラインで使用するファイル グロビングに似ています。
たとえば、次の例では、ホーム ディレクトリの下にあるすべてのファイルとディレクトリが表示されます。これは、上記の for5.sh の例で使用されている概念です。
cd ~ ls *
以下は、/etc ディレクトリの下にある a、b、または c または d のいずれかで始まるすべての *.conf ファイルを表示します。
$ ls -1 /etc/[abcd]*.conf /etc/asound.conf /etc/autofs_ldap_auth.conf /etc/cas.conf /etc/cgconfig.conf /etc/cgrules.conf /etc/dracut.conf
以下の例に示すように、上記の ls コマンドで使用されているのと同じ引数を bash for ループで使用できます。
$ cat for5-1.sh i=1 for file in /etc/[abcd]*.conf do echo "File $((i++)) : $file" done $ ./for5-1.sh File 1 : /etc/asound.conf File 2 : /etc/autofs_ldap_auth.conf File 3 : /etc/cas.conf File 4 : /etc/cgconfig.conf File 5 : /etc/cgrules.conf File 6 : /etc/dracut.conf
6. for ループから抜け出す
以下に示すように、「break」コマンドを使用して for ループから抜け出すことができます。
$ cat for6.sh i=1 for day in Mon Tue Wed Thu Fri do echo "Weekday $((i++)) : $day" if [ $i -eq 3 ]; then break; fi done $ ./for6.sh Weekday 1 : Mon Weekday 2 : Tue
7. for ループの先頭から続行
特定の条件下では、for ループ内の残りのコマンドを無視し、次に示すように continue コマンドを使用して、(リスト内の次の値に対して) ループを最初からやり直すことができます。
次の例では、土曜と日曜に「(WEEKEND)」を追加し、それ以外の曜日に「(平日)」を追加します。
$ cat for7.sh i=1 for day in Mon Tue Wed Thu Fri Sat Sun do echo -n "Day $((i++)) : $day" if [ $i -eq 7 -o $i -eq 8 ]; then echo " (WEEKEND)" continue; fi echo " (weekday)" done $ ./for7.sh Day 1 : Mon (weekday) Day 2 : Tue (weekday) Day 3 : Wed (weekday) Day 4 : Thu (weekday) Day 5 : Fri (weekday) Day 6 : Sat (WEEKEND) Day 7 : Sun (WEEKEND)
8. C プログラム構文を使用した Bash for ループ
この例では、C の for ループ構文に似た bash for ループの 2 番目の方法を使用します。次の例では、bash C スタイルの for ループを使用して 5 つの乱数を生成します。
$ cat for8.sh for (( i=1; i <= 5; i++ )) do echo "Random number $i: $RANDOM" done $ ./for8.sh Random number 1: 23320 Random number 2: 5070 Random number 3: 15202 Random number 4: 23861 Random number 5: 23435
9.ループの無限 Bash
bash C スタイルの for ループで開始、条件、インクリメントを指定しないと、無限ループになります。ループを停止するには、Ctrl-C を押す必要があります。
$ cat for9.sh i=1; for (( ; ; )) do sleep $i echo "Number: $((i++))" done
上で述べたように、Ctrl-C を押して、この bash の無限 for ループの例から抜け出します。
$ ./for9.sh Number: 1 Number: 2 Number: 3
10. bash C スタイルの for ループでのコンマの使用
bash の C スタイルのループでは、条件で使用される値をインクリメントする以外に、以下に示すように他の値をインクリメントすることもできます。
初期化セクション、および bash C スタイルの for ループのインクリメント セクションでは、以下に示すようにコンマで区切ることで複数の値を指定できます。
次の for ループは、変数 i を使用して合計 5 回実行されます。ただし、変数 j は 5 から始まり、ループが実行されるたびに 5 ずつインクリメントされます。
$ cat for10.sh for ((i=1, j=10; i <= 5 ; i++, j=j+5)) do echo "Number $i: $j" done $ ./for10.sh Number 1: 10 Number 2: 15 Number 3: 20 Number 4: 25 Number 5: 30
11. 「in」キーワードの後の数値の範囲
波括弧展開を使用して、for ループ「in」で数値の範囲を使用してループスルーできます。
次の例では、1 ~ 10 の値を使用して 10 回ループします。
$ cat for11.sh for num in {1..10} do echo "Number: $num" done $ ./for11.sh Number: 1 Number: 2 Number: 3 Number: 4 Number: 5 ...
12. 「in」キーワードの後に増加する数値の範囲
次の例では、値 1 から 10 を使用して、2 ずつ増分して 5 回ループします。つまり、1 から始まり、10 に達するまで 2 ずつ増分し続けます。
$ cat for12.sh for num in {1..10..2} do echo "Number: $num" done $ ./for12.sh Number: 1 Number: 3 Number: 5 Number: 7 Number: 9
追伸: 今後の参考のために、この記事をブックマークすることを忘れないでください。
-
Bash Shell PS1:Angelina Jolie のような Linux プロンプトを作成する 10 の例
f1r3storm85 提供の写真 前回の記事では、Linux 環境変数 PS[1-4] と PROMPT_COMMAND について説明しました。効果的に使用すれば、PS1 はコマンド プロンプトですぐに貴重な情報を提供できます。 トゥーム レイダーでは、アンジェリーナ ジョリーがすべてのガジェットと武器を指先で操作して、スタイリッシュに謎を解き明かします。アンジェリーナ・ジョリーのガジェットとスタイルは一致させるのが難しいですが、少なくとも、この記事で提供されている 10 の例を使用して、古き良き Linux プロンプトを非常に機能的でスタイリッシュなものにしてみましょう. 1.ユー
-
5 つの実用的な例を含む Bash スクリプト入門チュートリアル
進行中の Unix Sed および Unix Awk シリーズと同様に、Bash スクリプトに関するいくつかの記事を投稿します。実用的な例ですべての bash スクリプト テクニックをカバーします。 シェルは、ユーザー コマンドを解釈するプログラムです。コマンドは、ユーザーが直接入力するか、シェル スクリプトと呼ばれるファイルから読み取るかのいずれかです。ユーザーからの入力を直接読み取る場合、シェルは対話型シェルとして呼び出されます。 シェルは、ファイルからコマンドを読み取って実行するときに、非対話型シェルとして呼び出されます。この場合、シェルはスクリプト ファイルの各行を上から下に読み取