【问题标题】:Is there a do-while loop in bash? [duplicate]bash 中有一个 do-while 循环吗? [复制]
【发布时间】:2014-08-16 16:55:52
【问题描述】:

bash 中有 do-while 循环吗?

我知道如何在 bash 中编写 while 循环:

while [[ condition ]]; do
    body
done

是否有类似的构造,但对于do-while 循环,无论while 条件如何,body 至少执行一次?

【问题讨论】:

  • 通读手册页中的 bash 内置函数列表并查看它们中的任何一个是否是 do-while 会有多难?
  • @Barmar 寻找不存在的东西比寻找存在的东西要困难得多。

标签: bash


【解决方案1】:

while 循环足够灵活,也可以用作do-while 循环:

while 
  body
  condition
do true; done

例如,要求输入并循环直到它是一个整数,你可以使用:

while
  echo "Enter number: "
  read n
  [[ -z $n || $n == *[^0-9]* ]]
do true; done

这甚至比普通的do-while 循环更好,因为您可以拥有仅在第一次迭代之后执行的命令:将true 替换为echo "Please enter a valid number"

【讨论】:

  • +1。但是do :; done 是一个更好的noop
  • 同一个 noop 写法不同。
  • 我的立场是正确的。至少在 bash 中,它们是同义词。
  • 我想指出,使用此表单,如果您依赖set -e 在任何单独的行失败时中止脚本,bash 将不会中止body 部分中的行!因此,最好使用@Barmar 的答案中的表格。
【解决方案2】:

不,bash 中没有 do-while 运算符。你可以模仿它:

while true; do
    body
    [[ condition ]] || break
done

【讨论】:

  • 即使接受的答案表明实际上有一种方法可以在 bash 中编写 do-while 循环,但我仍然会这样做,因为这种方式遵循 set -e 并且接受的答案的方式确实如此似乎没有。
【解决方案3】:

你可能只是想试试这个,我不相信 bash 中有这样的东西。

doStuff(){
//first "iteration" here
}
doStuff
while [condition] do
doStuff
done

【讨论】:

  • 如果不在循环外调用,函数体永远不会执行。
  • 固定代码先调用函数。
猜你喜欢
  • 2010-09-13
  • 1970-01-01
  • 2013-05-05
  • 1970-01-01
  • 2018-02-15
  • 2011-12-16
  • 1970-01-01
  • 2018-04-06
  • 1970-01-01
相关资源
最近更新 更多