单行Bash无限循环的语法

Syntax for a single-line Bash infinite while loop

我很难找到分号和/或大括号的正确组合。我想这样做,但作为命令行中的一行程序:

1
2
3
4
5
while [ 1 ]
do
    foo
    sleep 2
done


1
while true; do foo; sleep 2; done

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

1
2
3
4
5
6
7
8
9
10
$ while true
> do
>    echo"hello"
>    sleep 2
> done
hello
hello
hello
^C
$  while true; do    echo"hello";    sleep 2; done


在while的情况下也可以使用sleep命令。让一个内衬看起来更干净。

1
while sleep 2; do echo thinking; done


冒号总是"真的":

1
while :; do foo; sleep 2; done


您还可以使用until命令:

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

注意,与while相反,只要测试条件的退出状态不是零,until将在循环内执行命令。

使用while循环:

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

使用for循环:

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

使用until的另一种方法:

1
until [ ]; do foo; sleep 2; done


可以使用分号分隔语句:

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


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

1
while true ; do continue ; done

你的问题是:

1
while true; do foo ; sleep 2 ; done


我只喜欢在while语句中使用分号,以及使循环执行多个操作的运算符…

所以我总是这样做

1
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


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


如果您希望while循环在某个条件之后停止,并且您的foo命令在满足该条件时返回非零,那么您可以使循环像这样中断:

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

例如,如果foo命令正在批量删除内容,并且在没有剩余内容可删除时返回1。

如果有一个自定义脚本需要多次运行一个命令,直到出现某种情况,那么这个脚本就会很好地工作。当条件满足时,编写脚本退出1,当需要再次运行时,使用0退出。

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

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


你也可以试试这个警告:您不应该这样做,但由于问题是要求无限循环没有结束…这是您可以这样做。

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


如果我能举两个实际的例子(带点"情感")。

这将在文件夹"img"中写入以".jpg"结尾的所有文件的名称:

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

这将删除它们:

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

只是想贡献自己。