在 linux 的 Bash shell 中, while 復(fù)合命令 (compound command) 和 until 復(fù)合命令都可以用于循環(huán)執(zhí)行指定的語句,直到遇到 false 為止。查看 man bash 里面對(duì) while 和 until 的說明如下:
while list-1; do list-2; done
until list-1; do list-2; done
The while command continuously executes the list list-2 as long as the last command in the list list-1 returns an exit status of zero.
The until command is identical to the while command, except that the test is negated; list-2 is executed as long as the last command in list-1 returns a non-zero exit status.
The exit status of the while and until commands is the exit status of the last command executed in list-2, or zero if none was executed.
可以看到,while 命令先判斷 list-1 語句的最后一個(gè)命令是否返回為 0,如果為 0,則執(zhí)行 list-2 語句;如果不為 0,就不會(huì)執(zhí)行 list-2 語句,并退出整個(gè)循環(huán)。
即,while 命令是判斷為 0 時(shí)執(zhí)行里面的語句。
跟 while 命令的執(zhí)行條件相反,until 命令是判斷不為 0 時(shí)才執(zhí)行里面的語句。
注意:這里有一個(gè)比較反常的關(guān)鍵點(diǎn),bash 是以 0 作為 true,以 1 作為 false,而大部分編程語言是以 1 作為 true,0 作為 false,要注意區(qū)分,避免搞錯(cuò)判斷條件的執(zhí)行關(guān)系。
在 bash 中,常用 test 命令、[ 命令、[[ 命令來判斷條件,但是 while 命令并不限于使用這幾個(gè)命令來進(jìn)行判斷,實(shí)際上,在 while 命令后面可以跟著任意命令,它是基于命令的返回值來進(jìn)行判斷,分別舉例說明如下。
- 下面的 while 循環(huán)類似于C語言的 while (--count >= 0) 語句,使用 [ 命令來判斷 count 變量值是否大于 0,如果大于 0,則執(zhí)行 while 循環(huán)里面的語句:
count=3 while [ $((--count)) -ge 0 ]; do # do some thing done
- 下面的 while 循環(huán)使用 read 命令讀取 filename 文件的內(nèi)容,直到讀完為止,read 命令在讀取到 EOF 時(shí),會(huì)返回一個(gè)非 0 值,從而退出 while 循環(huán):
while read fileline; do # do some thing done < filename
- 下面的 while 循環(huán)使用 getopts 命令處理所有的選項(xiàng)參數(shù),一直處理完、或者報(bào)錯(cuò)為止:
while getopts "rich" arg; do # do some thing with $arg done
如果要提前跳出循環(huán),可以使用 break 命令。查看 man bash 對(duì) break 命令說明如下:
break [n]
Exit from within a for, while, until, or select loop.
If n is specified, break n levels. n must be ≥ 1. If n is greater than the number of enclosing loops, all enclosing loops are exited.
The return value is 0 unless n is not greater than or equal to 1.
即,break 命令可以跳出 for 循環(huán)、while 循環(huán)、until 循環(huán)、和 select 循環(huán)。