在Bash中是否有do-while循环?

23

在bash中是否有do-while循环?

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

while [[ condition ]]; do
    body
done

是否有类似的结构,用于do-while循环,在这种结构中,body会至少执行一次,而不管while条件如何?


阅读bash内置命令列表并查看其中是否有do-while,这有多难? - Barmar
7
寻找不存在的东西比寻找已存在的东西要难得多。 - llf
3个回答

44

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循环更好,因为你可以有一些只在第一次迭代之后执行的命令:用echo "Please enter a valid number"替换true


3
+1. 但是,“do :; done” 是一个更好的无操作命令。 - rici
1
这是相同的noop,只是用不同的方式编写。 - that other guy
1
我改正了。至少在Bash中,它们是同义词。 - rici
5
我想指出,如果你依赖于set -e在任何一行发生错误时终止脚本的话,使用这个形式将不会对body部分中的行起作用!因此最好使用@Barmar答案中的形式。请注意不要改变原意。 - Ben XO
1
@BenXO 最好不要使用 set -e,而是自己进行错误检测。 - lmat - Reinstate Monica

19

bash中没有do-while运算符。您可以使用以下方法模拟:

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

2
尽管被接受的答案表明实际上有一种方法可以在Bash中编写do-while循环,但我仍然会按照这种方式进行操作,因为这种方式遵守了set -e,而被接受的答案的方式似乎没有。 - Ben XO

1

你可能只想尝试这个,我认为在bash中没有这样的东西。

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

1
如果循环外没有调用,函数体将永远不会被执行。 - Soren
修正了调用函数的代码。 - mtbjay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接