2009-08-17 22 views
449

我有想出分号和/或括号的正确组合的麻烦。我想这样做,但在命令行一个班轮:语法单行猛砸无限while循环

while [ 1 ] 
do 
    foo 
    sleep 2 
done 
+4

用分号替换换行符。 for循环的作用相同。 – Tom 2009-08-17 16:34:06

+19

@Tom:这并不总是奏效。在做之后,你必须有第一个命令,而不是用分米和韵的分号 – 2009-08-17 16:38:22

回答

835
while true; do foo; sleep 2; done 

顺便说一句,如果你键入它作为一个多(因为你是显示)在命令提示符下然后用箭头向上调用历史记录,你会在一行中得到它,正确地加上标点符号。

$ while true 
> do 
> echo "hello" 
> sleep 2 
> done 
hello 
hello 
hello 
^C 
$ <arrow up> while true; do echo "hello"; sleep 2; done 
+230

+1。这是一个很棒的助记符:“如果您在命令提示符下键入多行(如您所示),然后使用箭头调用历史记录,则”true * do * foo * sleep * too * la di da“:D – Shabbyrobe 2011-12-10 06:55:37

+1

你可以在一条线上得到它,正确地打断它。“对我来说并非如此。 – 2013-01-09 21:35:09

+0

@VincentScheib,如果你使用bash,请检查'cmdhist'选项? – 2013-03-05 18:56:30

23

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

$ while [ 1 ]; do foo; sleep 2; done 
+0

我喜欢这个答案,因为它解释了何时和为什么; (分号)是必需的。 – 2017-05-19 10:29:55

6

我喜欢用分号只为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 
+1

那么,在循环中使用'&&'和其他时间是一样的。你是否需要第二件事情发生,只有当第一件事情发生时,然后使用'&&'else';'就足够了。真的,你想保持这个循环的内容简短,理想情况下只有一个命令,所以一个函数或脚本。 – thecoshman 2015-07-07 13:03:02

1

如果我可以举两个实例(带点“情感”)。

这会将所有文件的名称与文件夹 “IMG”, “.JPG” 结束:

for f in *; do if [ "${f#*.}" == 'jpg' ]; then echo $f; fi; done 

这将删除他们:

for f in *; do if [ "${f#*.}" == 'jpg' ]; then rm -r $f; fi; done 

只是想做出贡献。

+3

说起来容易些:'''在* .jpg中为'f;做echo $ f; '''' – JKnight 2013-06-20 22:45:00

+1

@JKnight - 对于这些例子,你不会只是**'ls -1 * .jpg' **和**'rm * .jpg' ** – 2014-01-19 21:31:39

+2

这两个都不是无限循环而不是循环。 – Marian 2015-04-23 21:38:04

126

它也可能在同时的条件使用睡眠命令。让单线看起来更清洁imho。

while sleep 2; do echo thinking; done 
+1

相关提示 – 2013-01-25 03:08:05

+5

这不仅仅是改变语法 - 它会在睡眠之后执行命令*。在之前的回答中,该命令立即执行。只需注意一点。 – DanGordon 2016-10-26 16:29:11

55

科隆始终是 “真”:

while :; do foo; sleep 2; done 
+11

为什么冒号总是正确的? – Michelle 2013-12-12 15:10:45

+5

@Pineapple Under the Sea: 来自bash手册页:(在SHELL BUILTIN COMMANDS部分) ':[参数]' 没有影响;该命令除了扩展参数和执行任何指定的重定向之外什么都不做。返回零退出代码。 – 2014-01-17 21:45:25

+2

该语法推荐为:是shell本身的一部分,即:是shell内置命令。 – avner 2014-02-25 17:59:52

18

您还可以使用until命令:

until ((0)); do foo; sleep 2; done 

注意的是,与whileuntil将执行中的命令只要测试条件具有非零的退出状态,该循环就可以。


使用while循环:

while read i; do foo; sleep 2; done < /dev/urandom 

使用for循环:

for ((;;)); do foo; sleep 2; done 

使用until另一种方式:

until [ ]; do foo; sleep 2; done 
+4

+1可供选择的解决方案。 – glen3b 2013-09-29 01:33:17

5

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

while true ; do continue ; done 

神父您的问题将是:

while true; do foo ; sleep 2 ; done 
2

对于简单的过程看使用watch代替

0

你可以试试这个太 警告:这你不应该做的,但由于问题是要求无限循环,没有结束......这是你如何做到的。

while [[ 0 -ne 1 ]]; do echo "it's looping"; sleep 2; done 
+0

你为什么要这么做? – 2017-02-07 21:02:40

+1

,因为发布该问题的Brian Deacon想要一个无限循环。这不只是一种方法去皮肤猫,这是所有 – 2017-02-07 21:51:50

1

如果你想while循环一定条件后停止,您foo命令返回非零时,这个条件满足,那么你可以得到循环来打破这样的:

while foo; do echo 'sleeping...'; sleep 5; done; 

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

如果您有一个自定义脚本,需要多次运行命令,直到出现某种情况,这种方式才能正常工作。当条件满足时,编写脚本以1退出,并在应该再次运行时以0退出。

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

while batch_update.py; do echo 'sleeping...'; sleep 5; done; 
+0

和你将如何退出? – 2018-01-17 22:45:39

+0

当您希望while循环中断时,您可以使用代码'1'使'foo'命令退出。我用一个例子更新了我的答案。 – 2018-01-18 02:31:20