Linux Bash 是否有 do-while 循环?

Does Linux Bash have a do-while loop?

在 Internet 上进行一些搜索后,Bash 似乎没有 do-while 循环。

这是正确的吗?是否有可靠的来源来证实这一点(缺乏证据表明存在 do-while 循环并不是说没有,也许声明只是 不受欢迎)?

是否可以自己定义指令并实现 do-while 循环?有一种算法方法可以将 do-while 循环转换为 while 循环,但这是 not本题范围

否,bash 没有 do-while 循环。 manual section 3.2.4.1 Looping Constructs 列出 untilwhilefor注意没有do-while.

bash(或一般的 Posix shell)没有明确的 post 测试循环语法(通常称为 "do-while" loop) 因为语法是多余的。 while 复合语句允许您使用相同的语法编写预测试、post-测试或中期测试循环。

这是 shell while 循环的语义,来自 Posix:

The format of the while loop is as follows:

while compound-list-1
do
  compound-list-2
done

The compound-list-1 shall be executed, and if it has a non-zero exit status, the while command shall complete. Otherwise, the compound-list-2 shall be executed, and the process shall repeat.

一个"compound list"是一个命令序列;复合列表的退出状态是列表中最后一个命令的退出状态。

这意味着你可以认为一个 while 循环是这样写的:

while
  optional-pre-test-compound-list
  condition
do
  post-test-compound-list
done

不要求要测试的条件紧跟while关键字。所以相当于C语法:

do statements while (test);

while statements; test do :; done

do和done之间的:是必须的,因为shell语法不允许空语句。由于:不是元字符,所以它前后必须有空格或元字符;否则,它将被解析为前面或后面的标记的一部分。由于它被解析为命令,因此它后面还需要一个分号或换行符;否则 done 被视为 :.

的参数