单线Bash无限while循环的语法

我有麻烦提出分号和/或大括号的正确组合。 我想这样做,但作为命令行的一行:

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

顺便说一句,如果您在命令提示符下键入它作为多行(如您所示),然后用箭头向上调用历史logging,您将在单行上正确地加上标点符号。

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

在条件下也可以使用睡眠命令。 让单线看起来更干净的恕我直言。

 while sleep 2; do echo thinking; done 

冒号总是“真实的”:

 while :; do foo; sleep 2; done 

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

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

你也可以使用, until命令:

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

请注意,与while相反,只要testing条件具有不为零的退出状态,将执行循环内的命令。


使用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 

我喜欢用分号只用于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 

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

 while true ; do continue ; done 

Fr你的问题将是:

 while true; do foo ; sleep 2 ; done 

用简单的过程观看使用watch来代替

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

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

 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 

只是想贡献。

你也可以试试

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

如果你想让while循环在一些条件之后停止,并且当这个条件满足时你的foo命令返回非零值,那么你可以得到这样的循环:

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

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