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


27

whileループとは何かを知っています。しかし、私はそれが動作するのを見ました:

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

声明は、後にどこwhileのいずれかである必要がありますTRUEFALSE

という名前のシェル組み込みコマンドがあり:ます。それは、何もしないダミーのコマンドとして記述されているが、それはここでは同じである場合、私はそれができたとしても、知りませんTRUEFALSE。何か違うかもしれませんが、何ですか?


4
このコマンド:は何もしませんが、常にリターンコード0で終了します。したがって、同じでしたwhile true(システムにtrue実行可能ファイルがある場合)。
John1024

@ John1024引数の評価が読み取り専用変数に値を割り当てるなどしてエラーを引き起こさない限り、ゼロを返します。
クサラナナンダ

3
@Kusalanandaはい、:コマンドが実行されない場合、0は返されません。しかし、それは私の意見では非常につまらないものです。
hvd

回答:


50

構文は次のとおりです。

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」文字列が空ではないかどうかをテストするコマンドを呼び出しています(したがって、常に真です)

while ((1)); do cmd; done

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

または、より複雑なもの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/ while/ until条件リストでのみ使用する必要はなく、これらの条件リストにはありませんそのコマンドを他のどのコマンドよりも多く使用するには。


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

while : you wait; do
  something
done

しかし、次の動作:

until false is true; do
  something
done

指定されていません(ただし、ほとんどのシェル/ false実装で機能します)。


12

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

したがって、何もせずにシェルを永久にハングさせたい場合は、次のように記述できます。

while :
do
    :
done

または、;改行の代わりに単一行で:while :; do :; done

while :通常、特別な条件を付けずに何かを繰り返し実行する場合に使用します。ループ内continuebreakステートメントを使用して、ループを制御したり、do ... whileコンストラクトのように条件をループの最後に移動したりできます。


12

ただし、whileの後のステートメントはTRUEまたはFALSEでなければなりません。

いいえ、条件部分のコマンドには任意のコマンド(*)を使用できます。すべてのシェルコマンドには何らかの戻り値があり、whileループ(およびif条件付き)はゼロの戻り値を「true」、その他のすべての値を「false」とします。(*またはいくつかのコマンドのリスト、最後のものがカウントされます)

に関しては:Bashのマニュアルには、その返品ステータスが明確に記載されています。

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

help組み込みは、より明確です:

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

s/any command/any sequence of commands/、ステファンが明らかにするように。
トビースパイト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.