「while :;」とはどういう意味ですか?

「while :;」とはどういう意味ですか?

ループとは何かは知っていますwhile。しかし、それが機能するのは以下の場合だけです。

while [condition]
while ![condition]
while TRUE (infinite loop)

後の文はまたはのwhileいずれかである必要があります。TRUEFALSE

というシェル組み込みコマンドがあります:。これは何もしないダミーコマンドとして説明されていますが、ここでも同じかどうかはわかりません。 または であっても同じです。TRUEFALSEか違うものかもしれませんが、それは何でしょうか?

答え1

構文は次のとおりです。

while
  first list of commands
do
  second list of commands
done

これは、最初のコマンド リスト (つまり、そのリスト内の最後の実行) が成功する限り、2 番目のコマンド リストをループで実行します。

その中で最初のコマンドリスト[コマンドを使用してさまざまな種類のテストを実行したり、:何もせずに成功を返す null コマンドやその他のコマンドを使用したりできます。

while :; do cmd; done

cmdいつものように何度も実行し:、成功を返します。それが永遠にループします。true代わりに、より読みやすくするために次のコマンドを使用できます。

while true; do cmd; done

昔は、 が常に組み込まれているの:に対し、 は組み込まれていない (かなり昔の話です。現在ではほとんどのシェルに組み込まれています)¹ ことが好まれていました。:truetrue

他にも次のようなバリエーションが見られることがあります:

while [ 1 ];  do cmd; done

上記では、文字列「1」が空でないかどうかをテストするコマンドを呼び出しています[(したがって、常に true です)。

while ((1)); do cmd; done

Korn/bash/zsh 構文を使用してC を((...))模倣します。while(1) { ...; }

あるいは、次のようなもっと複雑なものもありますuntil false; do cmd; doneuntil ! true

これらは次のように別名で呼ばれることがあります:

alias forever='while :; do'

したがって、次のようなことができます。

forever cmd; done

この症状がリストコマンドの例:

while :; do
  cmd1
  cmd2 || break
  cmd3
done

次のように書くことができたとき:

while
  cmd1
  cmd2
do
  cmd3
done

それは理にかなっているリストwhile cmd1 && cmd2; do...; done多くの場合、コマンド リストのような操作も実行したいためです。

いずれにせよ、 は[他のコマンドと同じように (最新の Bourne のようなシェルに組み込まれていますが)、 // 条件リストでのみ使用する必要はなくif、それらの条件リストでは他のコマンドよりも このコマンドを多く使用する必要はないことに注意してくださいwhileuntil


¹も短く、引数を受け入れます (引数は無視されます)。引数を渡した場合のor:の動作は未指定です。たとえば、次のようにすることができます。truefalse

while : you wait; do
  something
done

しかし、次のような行動は、

until false is true; do
  something
done

指定されていません (ただし、ほとんどの shell/ 実装では動作しますfalse)。

答え2

while :無限ループです。:何もしません (成功)。

シェルを何もせずに永遠にハングさせたい場合、次のように記述します。

while :
do
    :
done

;または、改行の代わりに1 行で次のように記述します。while :; do :; done

while :は、通常、特別な条件を付けずに何かを繰り返し実行したい場合に使用されます。ループ内でcontinue,breakステートメントを使用して、ループを制御したり、条件を構造のようにループの最後に移動したりすることができますdo ... while

答え3

ただし、while の後のステートメントは TRUE または FALSE のいずれかである必要があります。

いいえ、条件部分のコマンドは任意のコマンド(*)にすることができます。全てシェル コマンドには戻り値があり、whileループ (およびif条件) は戻り値が 0 の場合を「true」、それ以外を「false」とみなします。(* または複数のコマンドのリスト、最後のコマンドがカウントされます)

はどうかと言うと:Bashのマニュアル戻りステータスが何であるかを明確に示します。

: [arguments]
引数の展開とリダイレクトの実行以外は何も行いません。戻りステータスはゼロです。

組み込みhelpはさらに明確です:

 $ help :
 [...]
 No effect; the command does nothing
 Exit Status:
 Always succeeds.

関連情報