我知道什麼while
是循環。但是,我只看到它適用於:
while [condition]
while ![condition]
while TRUE (infinite loop)
其中後面的語句while
必須是TRUE
or FALSE
。
有一個名為 的 shell 內建指令:
。它被描述為一個不執行任何操作的虛擬命令,但我不知道這裡是否相同,即使它可以是TRUE
或FALSE
。也許這是不同的東西,但什麼呢?
答案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; 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 的 shell 中),它不必單獨在 // 條件列表中使用if
,並且這些條件列表沒有比任何其他命令更多地使用該命令。while
until
¹:
也更短並且接受參數(它會忽略)。如果您向其傳遞任何參數,則true
or的行為是未指定的。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.