ほとんどのプログラミング言語は、さまざまな形式のループ コード行をサポートしています。 Bash は、「while」ループ、「until」ループ、そして最もよく知られている「for」ループをネイティブにサポートしています。この記事では、3 つすべてを紹介し、説明します。
Bash ループと は何ですか?
これをもう少し適切に定義するには、 ループとは何かという 質問から始める必要があります。ループはプログラミング言語の構造であり、開発者がそのようなループ定義内のコードの特定の部分またはすべてを繰り返す (つまり、ループする) ことができます。 Bash ループを 、Bash で使用されるループ プログラミング言語構造として簡単に定義できるようになりました。
Bash は、「for」、「until」、および「while」ベースのループをネイティブにサポートします。これらにはそれぞれ独自の利点がありますが、主な単語のイディオムを見るだけで、その意味をすでに理解できます。たとえば、「until」を使用すると、「まで何かをする」ということを自然に考えるようになりますが、これは実際に Bash の「until」ループが行うことです。特定の条件が満たされるまで、一定量 (またはすべて) のコードをループします。
同様に、「while」ループは、条件が true でなくなるまで実行され続けます。最後に、「for」ループは、たとえば、「70 回、実行します…」と記述する方法と同様に、定義された回数だけループします。これは、各ループが提供する独自の機能を論理的に理解し、より読みやすいコードを実装するのに役立ちます。
ベースの Bash ループ の場合
この記事では、 Bash for ループ を定義する新しい形式を見ていきます。たとえば、Bash での for ループの定義は、やや古く、現代的ではありませんが、次のようになります。
for i in $(seq 1 5); do echo $i ; done
。これを、よりクリーン で 構造が改善された最新の検索ループと比較してみましょう。
for ((i=1;i<=5;i++)); $i をエコーします。終わり
この単純な Bash ベース
の
ワンライナー (Linux/Bash サークルで 1 行で書かれたミニスクリプトを概念化するためによく使用される用語) では、1 から 5 までの数字が順番に出力されます。
i
変数 (
$i
) の開始値を設定するには、
for
ループ定義の最初の部分と同じ値
1
を割り当て、
;
で終了します。デリミタ。
次に、
i<=5
を使用して、
「5 より小さいか等しい」
までは 1 つだけであることを指定します。次に、各ラウンドの終了時に何が起こるかを示します。つまり、変数
i
1 つ増やすか、一般的に使用される (C++ 言語などを含む) コーディングの短縮表現では、これは
i++
としてレンダリングされます。
最後に、
do
を使用してループ コードの開始を指定します。つまり、他のステートメントの終了と同様に、
for
ループ定義を終了した後、
;
を使用します。
do
前に。また、
done
を使用してループ コードの終了を指定し、
do
と
done
間の変数
i
の値を
echo
(出力) します。
また、
do
句自体が
;
で終了していないことにも特に注意してください。 、そうするとエラーが発生します。
do
、実行する必要があることの接頭辞であると考えると、より意味が分かります。
do
単に行の最後の単語になる可能性があるため、場合によっては複数行のスクリプトに記述した方がすっきりするのは、これが理由の 1 つかもしれません。
他のタイプのループを定義する場合でも、
do
句と
done
句は維持し、常にループ定義 (つまり
do
の前) を
;
で終了するようにします。 、また、
do...done
ループ定義内の個々のステートメントの終わりを
;
で終了します。 。
これを小さなスクリプトに入れて、物事がどのように機能するかをより明確に見てみましょう。
#!/bin/bash
for ((i=1;i<=10;i+=2));する
エコー $i
終わり
chmod +x test.sh
でスクリプトを実行可能にした後、同じものを実行します。スクリプトにいくつかの小さな変更が加えられました。今回は変数
i
毎回 2 ずつ増やしていることに注目してください。これは、別のコーディング短縮法、つまり
i+=2
を使用して行われます。これは、
i を 2 ずつ増やす
と読み取れます。同じ場所に
i=i+2
と書くこともでき、まったく同じように機能します。
1 から始まり、ループを通過するたびに 2 ずつ増加し、 9 で終了することがわかります。 9 で終わるのは、最大値が 10 で あるためです。したがって、 9 の 次の値は 11 となり、これは 10 より大きいため、表示/ループされません。
;
仕組みにも注意してください。エコーラインの後に削除されました。これは、代わりに行末の状況/文字がある場合、ステートメントの終わりを終了する必要がないためです。これがここに当てはまります。
echo $i
の後には他のコマンドはなく、行はすぐに終了します (行末にスペースがあっても問題ありません。原則として、新しいコマンド (および前のコマンド) が接頭辞として付けられない限り、別のコマンドは存在しないということです。
;
によって終了します。
while ベースの Bash ループ
次に、Bash ループを見てみましょう。同じ
do...done
ループ定義を使用して、指定された条件が true である限り実行される
while ベースの Bash ループ
を定義できます。
i=1; while [ $i -le 5 ]; $i をエコーします。 i=$[ i + 1 ];終わり
この例では、最初の for ベースのループの例と同じことを行います。定義はより複雑に見えますが (したがって、この特定のユースケースには for ループの方が適している可能性があります)、同じ方法で while ループをどのように定義できるかを見るのは興味深いことです。
ここでは、最初に、
;
で終わる別のコマンドで
i
変数を手動で設定します。 、
1
へ。次に、
if
ステートメントを定義するのとよく似た方法で、条件を設定する
while
ループを開始します (さらに詳しく知りたい場合は、この記事の最後に
if
ステートメントに関する記事へのリンクがあります)。
i
変数が 5 より小さいか等しいか (
-le
)、
5
より大きいかどうかを確認します。
この後、変数
echo
通常
i
do...done
ブロックがあり、その後、新しいステートメントで、
$[...]
Bash 計算イディオム。次に
until ベースの Bash ループ
をチェックアウトしてみましょう
ベースの Bash ループ まで
これまでに学んだことを踏まえて、次の until ベースの Bash ループをより簡単に評価できるようになりました。
i=1; [ $i -gt 5 ] まで; $i をエコーします。 i=$[ i + 1 ];終わり
ここでは、条件
i が
5
より大きい場合に true となるものを探します。そのような時まで (つまり、
until
ベースのループ)、前の
while ベース
の例と同様に、変数
i を
(
echo
を使用して) 出力し、同じ値を 1 ずつ増やします。
until
コマンドの構文が
while
コマンドと非常によく似ていることがわかります。また、
for
ベースのコマンドとは異なり、これらのコマンドは持続するための
true
条件 (
while
を使用)、または開始するための
true
条件 (
until
を使用) を検索することに注意してください。これにより、例えば
grep -q
ような、true/false のような出力を返すことができる他のコマンドを使用することもできます。
エコー 1 > a
while grep -q ‘1’ ./a; 「はい」をエコーします。 5 寝ます。終わり
ここでは、
a
という名前のファイルに数値
1
を追加し、
grep -q
(静かな grep) を使用してそのファイル内に数値
1
が存在するかどうかを確認します。それが真実でなくなるまで、私たちはそうし続けます(つまり
while
)。それは true ですが、テキスト
yes
を出力し、
sleep 5
でループを 5 秒間一時停止します。各コマンドが
;
で終了する方法に注意してください。また。
約 17 秒後、CTRL+C を使用してスクリプトを中断します。これは、Bash で実行中のプロセスを停止するための普遍的な方法です (プロセスをすぐに一時停止する、より強力で効果的な CTRL+Z は別ですが、これは別の記事で説明します)。
まとめ
この記事では、Bash でネイティブに使用できる ‘for’、’while’、および ‘until’ ループをレビューしました。 Bash にさらに興味がある場合は、 「Bash の条件テスト: if、then、else、elif」 および を参照してください。
楽しむ!





