ループとは何かは知っていますwhile
。しかし、それが機能するのは以下の場合だけです。
while [condition]
while ![condition]
while TRUE (infinite loop)
後の文はまたはのwhile
いずれかである必要があります。TRUE
FALSE
というシェル組み込みコマンドがあります:
。これは何もしないダミーコマンドとして説明されていますが、ここでも同じかどうかはわかりません。 または であっても同じです。TRUE
何FALSE
か違うものかもしれませんが、それは何でしょうか?
答え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
昔は、 が常に組み込まれているの:
に対し、 は組み込まれていない (かなり昔の話です。現在ではほとんどのシェルに組み込まれています)¹ ことが好まれていました。:
true
true
他にも次のようなバリエーションが見られることがあります:
while [ 1 ]; do cmd; done
上記では、文字列「1」が空でないかどうかをテストするコマンドを呼び出しています[
(したがって、常に true です)。
while ((1)); do cmd; done
Korn/bash/zsh 構文を使用してC を((...))
模倣します。while(1) { ...; }
あるいは、次のようなもっと複雑なものもありますuntil false; do cmd; done
。until ! 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
、それらの条件リストでは他のコマンドよりも このコマンドを多く使用する必要はないことに注意してくださいwhile
。until
¹も短く、引数を受け入れます (引数は無視されます)。引数を渡した場合のor:
の動作は未指定です。たとえば、次のようにすることができます。true
false
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.