"while :;" 是什麼意思?意思是?

"while :;" 是什麼意思?意思是?

我知道什麼while是循環。但是,我只看到它適用於:

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

其中後面的語句while必須是TRUEor FALSE

有一個名為 的 shell 內建指令:。它被描述為一個不執行任何操作的虛擬命令,但我不知道這裡是否相同,即使它可以是TRUEFALSE。也許這是不同的東西,但什麼呢?

答案1

語法是:

while
  first list of commands
do
  second list of commands
done

只要第一個命令列表(即該列表中的最後一次運行)成功,它就會循環運行第二個命令列表。

在那裡面第一個指令列表,您可以使用該[命令進行各種測試,也可以使用:不執行任何操作並返回成功的 null 命令,或任何其他命令。

while :; do cmd; done

cmd永遠一遍又一遍地運行,:一如既往地回報成功。這就是永遠環形。您可以使用該true命令來使其更清晰:

while true; do cmd; done

人們過去更喜歡:as:總是內建的,而true不是(很久以前;true現在大多數 shell 都有內建的)。

您可能會看到的其他變體:

while [ 1 ];  do cmd; done

上面,我們呼叫[命令來測試“1”字串是否非空(因此也始終為 true)

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 的 shell 中),它不必單獨在 // 條件列表中使用if,並且這些條件列表沒有比任何其他命令更多地使用該命令。whileuntil


¹:也更短並且接受參數(它會忽略)。如果您向其傳遞任何參數,則trueor的行為是未指定的。false例如,人們可以這樣做:

while : you wait; do
  something
done

但是,以下行為:

until false is true; do
  something
done

未指定(儘管它可以在大多數 shell/false實作中工作)。

答案2

while :是一個無限循環。:只是什麼也沒做(成功)。

因此,如果您希望 shell 永遠掛起而不執行任何操作,您可以將其寫入

while :
do
    :
done

或在單行中使用;而不是換行符:while :; do :; done

while :如果您想在沒有附加特殊條件的情況下重複執行某件事,通常會使用。您可以在循環中使用continue,break語句來控制它或像構造一樣將條件移動到循環末尾do ... while

答案3

然而,while 之後的語句必須為 TRUE 或 FALSE。

不可以,條件部分的指令可以是任意指令(*)全部shell 命令有一些返回值,while循環(以及if條件)將返回值零視為“真”,將所有其他值視為“假”。(* 或多個命令的列表,最後一個有效)

至於:Bash 的手冊清楚地說明了返回狀態是什麼:

: [arguments]
除了擴展參數和執行重定向之外,不執行任何操作。返回狀態為零。

內建help的更加清晰:

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

相關內容