我在使用分号和/或大括号的组合时遇到了麻烦。我想在命令行上将其作为一行代码完成:
while [ 1 ]
do
foo
sleep 2
done
我在使用分号和/或大括号的组合时遇到了麻烦。我想在命令行上将其作为一行代码完成:
while [ 1 ]
do
foo
sleep 2
done
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
cmdhist
选项? - Alok Singhalwhile true; do sh /Users/myuser/bin/vpn ; done
- Blisterpeanuts也可以在while的条件中使用sleep命令,我认为这样可以使一行代码看起来更加简洁。
while sleep 2; do echo thinking; done
while echo thinking || true ; do sleep 2 ; done
,但这样你会回到while true ; ...
。@DanGordon - Brian Carcich冒号始终为“true”:
while :; do foo; sleep 2; done
: [参数]
没有效果;该命令除了展开参数和执行任何指定的重定向外,不做其他任何事情。返回零退出代码。 - Adrian Wtrue
在 dash
和 bash
中都是内置命令。而且,尽管 POSIX 仅要求 true
可执行,但他们写道:“尽管 shell 的特殊内置命令 :
提供了类似的功能,因为 true
在历史脚本中被广泛使用,并且对于新手脚本阅读者来说 不那么晦涩。”(IEEE Std 1003.1-2001)。请参考此问题。 - jan-glx你可以使用分号来分隔语句:
$ while [ 1 ]; do foo; sleep 2; done
你也可以使用 until
命令:
until ((0)); do foo; sleep 2; done
请确认以下是否为需要翻译的内容:while
, until
would execute the commands inside the loop as long as the test condition has an exit status which is not zero.
while
loop:while read i; do foo; sleep 2; done < /dev/urandom
使用 for
循环:
for ((;;)); do foo; sleep 2; done
另一种方法是使用until
:until [ ]; do foo; sleep 2; done
使用while
循环:
while true; do echo 'while'; sleep 2s; done
使用 for
循环:
for ((;;)); do echo 'forloop'; sleep 2; done
使用递归
(与上面略有不同,键盘中断不能停止它)
list(){ echo 'recursion'; sleep 2; list; } && list;
sleep
中的单位时要小心,比如 sleep 1h
。在我的 zsh 中,它会忽略单位 h
并每秒运行一次命令。先快速查看一下您的环境中 sleep
命令支持哪些选项,可以避免不必要的麻烦。建议先执行 man sleep
命令来查看相关文档。 - Joshua Pinter一个非常简单的无限循环.. :)
while true ; do continue ; done
针对您的问题,答案如下:
while true; do foo ; sleep 2 ; done
如果只是想简单地监视进程,请使用watch
我喜欢仅在 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
&&
与任何其他时间的使用方式都是相同的。如果您需要第二件事情只在第一件事情发生时发生,那么请使用 &&
,否则 ;
就足够了。实际上,您希望保持该循环的内容简短而简单,最好只有一个命令,因此可以使用函数或脚本。 - thecoshmansleep
中的单位时要小心,比如 sleep 1h
。在我的 zsh 中,它会忽略单位 h
并每秒运行一次命令。先快速查看一下你的环境中 sleep
命令支持哪些选项,可以避免不必要的麻烦。建议先执行 man sleep
命令来查看相关文档。 - Joshua Pinterfoo
命令返回非零值,则可以使用以下方法中断循环:while foo; do echo 'sleeping...'; sleep 5; done;
foo
命令是批量删除元素的,当没有可删除的元素时返回1。1
,当应再次运行时则使用0
。batch_update.py
,它会更新数据库中的100行,并且如果有更多行需要更新,则返回0
;如果没有更多行需要更新,则返回1
。使用以下命令,可以每次更新100行,并在更新之间休眠5秒钟:while batch_update.py; do echo 'sleeping...'; sleep 5; done;
foo
命令以代码1
的状态退出来实现。我已经在我的答案中更新了一个示例。 - Yep_It's_Me