单行Bash无限循环的语法

Bri*_*con 595 bash loops while-loop

我无法想出正确的分号和/或括号组合.我想这样做,但作为命令行的一行代码:

while [ 1 ]
do
    foo
    sleep 2
done
Run Code Online (Sandbox Code Playgroud)

Ste*_*ini 1141

while true; do foo; sleep 2; done
Run Code Online (Sandbox Code Playgroud)

顺便说一句,如果你在命令提示符下键入多行(如你所示),然后用向上箭头调用历史记录,你将在一行上得到它,正确地标点.

$ while true
> do
>    echo "hello"
>    sleep 2
> done
hello
hello
hello
^C
$ <arrow up> while true; do    echo "hello";    sleep 2; done
Run Code Online (Sandbox Code Playgroud)

  • @VincentScheib在OS X和Ubuntu上为我工作. (3认同)
  • "如果你在命令提示符下输入多线(如你所示),然后用向上箭头调用历史记录,你就会在一行上得到它,正确地标点." 对我来说不是真的. (2认同)
  • @VincentScheib在CentOS 6上为我工作 (2认同)

Ans*_*ssi 161

也可以在while条件下使用sleep命令.使单线看起来更干净imho.

while sleep 2; do echo thinking; done
Run Code Online (Sandbox Code Playgroud)

  • 嗯,这不仅仅是改变语法 - 它将在*sleep之后执行命令*.在上一个答案中,命令立即执行.需要注意的事项. (14认同)
  • @DanGordon ```一边回声思考;睡觉 2 ;done``` 当然,如果 [while] 命令失败,循环就会退出,所以你必须 ```while echo 想 || 真的 ; 睡觉 2 ;完成````但是你又回到````while true ; ...``` (3认同)

小智 67

科隆总是"真实的":

while :; do foo; sleep 2; done
Run Code Online (Sandbox Code Playgroud)

  • 为什么冒号总是如此? (14认同)
  • @Pineapple Under the Sea:来自bash手册页:(在SHELL BUILTIN命令中)`:[参数]`没有效果; 除扩展参数和执行任何指定的重定向之外,该命令不执行任何操作.返回零退出代码. (8认同)
  • @avner:谁推荐的?`true` 也是 `dash` 和 `bash` 的内置函数。虽然 posix 只需要 `true` 作为可执行文件,但他们写道:“尽管 shell 特殊内置:提供了类似的功能,因为 *`true`* 广泛用于历史脚本中,并且 *对于新手脚本读者来说不太神秘* .`(IEEE Std 1003.1-2001)。另请参阅[此问题](https://unix.stackexchange.com/questions/34677/what-is-the-difference- Between-and-true) (3认同)
  • 推荐这个语法为:是shell本身的一部分,即:是一个shell内置命令. (2认同)

mip*_*adi 29

您可以使用分号分隔语句:

$ while [ 1 ]; do foo; sleep 2; done
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这个答案,因为它解释了何时以及为什么;(分号)为必填项。 (2认同)

dev*_*ull 28

您还可以使用until命令:

until ((0)); do foo; sleep 2; done
Run Code Online (Sandbox Code Playgroud)

请注意,与此相反while,until只要测试条件的退出状态不为零,就会执行循环内的命令.


使用while循环:

while read i; do foo; sleep 2; done < /dev/urandom
Run Code Online (Sandbox Code Playgroud)

使用for循环:

for ((;;)); do foo; sleep 2; done
Run Code Online (Sandbox Code Playgroud)

另一种使用方式until:

until [ ]; do foo; sleep 2; done
Run Code Online (Sandbox Code Playgroud)


小智 10

一个非常简单的无限循环.. :)

while true ; do continue ; done
Run Code Online (Sandbox Code Playgroud)

你的问题将是:

while true; do foo ; sleep 2 ; done
Run Code Online (Sandbox Code Playgroud)


小智 8

我喜欢仅将分号用于WHILE语句,而使用&&运算符使循环执行多个操作...

所以我总是这样做

while true ; do echo Launching Spaceship into orbit && sleep 5s && /usr/bin/launch-mechanism && echo Launching in T-5 && sleep 1s && echo T-4 && sleep 1s && echo T-3 && sleep 1s && echo T-2 && sleep 1s && echo T-1 && sleep 1s && echo liftoff ; done
Run Code Online (Sandbox Code Playgroud)


Muh*_*man 8

使用while

while true; do echo 'while'; sleep 2s; done
Run Code Online (Sandbox Code Playgroud)

使用for循环:

for ((;;)); do echo 'forloop'; sleep 2; done
Run Code Online (Sandbox Code Playgroud)

使用Recursion, (与上面有点不同,键盘中断不会阻止它)

list(){ echo 'recursion'; sleep 2; list; } && list;
Run Code Online (Sandbox Code Playgroud)

  • 小心使用“睡眠”中的单位,例如“睡眠 1 小时”。在我的 zsh 中,它忽略单位“h”并每 1 秒运行一次我的命令。首先快速执行“man sleep”以查看您的环境的“sleep”命令支持什么。或许可以帮你省去头痛的麻烦。 (3认同)

小智 7

对于简单的过程监视,请watch改用


Vic*_*ema 7

您甚至不需要使用doand donefor对于无限循环,我发现与大括号一起使用更具可读性。例如:

for ((;;)) { date ; sleep 1 ; }
Run Code Online (Sandbox Code Playgroud)

这适用于bashzsh。在 中不起作用sh


Yep*_*_Me 5

如果您希望while循环在某些条件后停止,并且在foo满足此条件时命令返回非零值,则可以使循环中断,如下所示:

while foo; do echo 'sleeping...'; sleep 5; done;
Run Code Online (Sandbox Code Playgroud)

例如,如果foo命令正在批量删除事物,并且在没有什么要删除的情况下返回1。

如果您有一个自定义脚本,该脚本需要多次运行命令直到出现某种情况,则此方法很好用。您编写脚本以1在满足条件0时退出,并在应再次运行时退出。

例如,假设您有一个python脚本batch_update.py,该脚本将更新数据库中的100行,并0在有更多更新和1没有更新时返回。以下命令将允许您一次更新行100,并在两次更新之间休眠5秒:

while batch_update.py; do echo 'sleeping...'; sleep 5; done;
Run Code Online (Sandbox Code Playgroud)