单行Bash无限循环的语法

时间:2009-08-17 16:31:47

标签: bash loops while-loop

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

while [ 1 ]
do
    foo
    sleep 2
done

14 个答案:

答案 0 :(得分:1061)

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

答案 1 :(得分:153)

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

while sleep 2; do echo thinking; done

答案 2 :(得分:65)

Colon始终是“真实的”:

while :; do foo; sleep 2; done

答案 3 :(得分:27)

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

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

答案 4 :(得分:27)

您还可以使用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

答案 5 :(得分:9)

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

while true ; do continue ; done

Fr你的问题是:

while true; do foo ; sleep 2 ; done

答案 6 :(得分:8)

我喜欢仅将分号用于WHILE语句, 和&amp;&amp;运算符使循环不止一件事......

所以我总是这样做

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

答案 7 :(得分:6)

对于简单的流程观看,请使用watch代替

答案 8 :(得分:3)

如果你希望while循环在某些条件之后停止,并且你的foo命令在满足这个条件时返回非零,那么你可以让循环中断,如下所示:

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

例如,如果foo命令正在批量删除,则在没有任何内容可以删除时返回1。

如果您有一个需要多次运行命令的自定义脚本,直到某些条件,这都很有效。您编写脚本以在满足条件时退出1,并在应该再次运行时退出0

例如,假设您有一个python脚本batch_update.py,它会更新数据库中的100行,如果有更新要更新,则返回0,如果没有更新,则返回1。以下命令允许您在更新之间休眠5秒钟一次更新行100:

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

答案 9 :(得分:2)

如果我能给出两个实际例子(带有一点“情绪”)。

这会在“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

只是想做出贡献。

答案 10 :(得分:2)

你也可以尝试一下 警告:你不应该这样做,但因为问题是要求无限循环而没有结束......这就是你可以做到的。

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

答案 11 :(得分:1)

使用while

while true; do echo 'while'; sleep 2s; done

使用for循环:

for ((;;)); do echo 'forloop'; sleep 2; done

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

list(){ echo 'recursion'; sleep 2; list; } && list;

答案 12 :(得分:0)

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

for ((;;)) { date ; sleep 1 ; }

这适用于bashzsh。在sh中无效。

答案 13 :(得分:0)

您也可以将该循环置于后台(例如,当您需要与远程机器断开连接时)

nohup bash -c "while true; do aws s3 sync xml s3://bucket-name/xml --profile=s3-profile-name; sleep 3600; done &"