我在提出分号和/或花括号的正确组合时遇到了麻烦。我想这样做,但是作为命令行的单行代码:
while [ 1 ]
do
foo
sleep 2
done
我在提出分号和/或花括号的正确组合时遇到了麻烦。我想这样做,但是作为命令行的单行代码:
while [ 1 ]
do
foo
sleep 2
done
Answers:
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
选项是否正在使用bash?
while true; do sh /Users/myuser/bin/vpn ; done
也可以在while条件下使用sleep命令。使单线看起来更干净恕我直言。
while sleep 2; do echo thinking; done
while echo thinking ; do sleep 2 ; done
当然,如果[while]命令失败,则循环将退出,因此您必须这样做while echo thinking || true ; do sleep 2 ; done
,然后您将返回while true ; ...
冒号始终是“ true”:
while :; do foo; sleep 2; done
: [arguments]
无效;该命令除了扩展参数和执行任何指定的重定向外,什么也不做。返回零退出代码。
您可以使用分号来分隔语句:
$ while [ 1 ]; do foo; sleep 2; done
您还可以使用以下until
命令:
until ((0)); do foo; sleep 2; done
请注意,与相比while
,until
只要测试条件的退出状态不为零,就可以在循环内执行命令。
使用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
until ((0)); do foo; sleep 2; done
似乎没有工作时。它连续无限。
我喜欢只对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
&&
在循环中的使用与其他时间完全相同,不是吗?您是否仅在第一件事发生时才需要第二件事发生,然后使用&&
else ;
就足够了。确实,您希望使该循环的内容简短而简单,理想情况下,只需一个命令,即一个函数或一个脚本即可。
对于简单的过程,观看使用watch
,而不是
如果您希望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;
foo
使用代码使命令退出1
。我用一个例子更新了我的答案。
您也可以尝试这样做。警告:您不应该这样做,但是由于问题是要求无限循环,这是您可以做到的。
while [[ 0 -ne 1 ]]; do echo "it's looping"; sleep 2; done