我在想出分号和/或大括号的正确组合时遇到了麻烦。我想这样做,但作为命令行的一行代码:
while [ 1 ]dofoosleep 2done
while true; do foo; sleep 2; done
顺便说一句,如果您在命令提示符下将其键入为多行(如您所示),然后使用箭头向上调用历史记录,您将在单行中获得它,正确标点。
$ while true> do> echo "hello"> sleep 2> donehellohellohello^C$ <arrow up> while true; do echo "hello"; sleep 2; done
您可以使用分号分隔语句:
$ while [ 1 ]; 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
如果我能举两个实际的例子(带有一点“情感”)。
这会将所有以“. 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 sleep 2; do echo thinking; done
冒号永远是“真”:
while :; do foo; sleep 2; done
您还可以使用until命令:
until
until ((0)); do foo; sleep 2; done
请注意,与while相比,只要测试条件的退出状态不为零,until就会在循环内执行命令。
while
使用while循环:
while read i; do foo; sleep 2; done < /dev/urandom
使用for循环:
for
for ((;;)); do foo; sleep 2; done
另一种使用until的方法:
until [ ]; do foo; sleep 2; done
一个非常简单的无限循环…:)
while true ; do continue ; done
如果你的问题是:
while true; do foo ; sleep 2 ; done
对于简单的过程观察,请使用watch代替
watch
你也可以试试警告:你不应该这样做,但由于问题是要求无限循环没有尽头……这就是你可以做到的。
while [[ 0 -ne 1 ]]; do echo "it's looping"; sleep 2; done
如果你想在某个条件之后停止,并且你的foo命令在满足此条件时返回非零,那么你可以让循环像这样中断:
foo
while foo; do echo 'sleeping...'; sleep 5; done;
例如,如果foo命令正在批量删除内容,当没有剩余可删除的内容时,它返回1。
如果您有一个自定义脚本需要多次运行命令直到某个条件,这很有效。您编写脚本以在满足条件时以1退出,并在应该再次运行时以0退出。
1
0
例如,假设您有一个python脚本batch_update.py,它更新数据库中的100行,如果有更多要更新的行,则返回0,如果没有更多,则返回1。以下命令将允许您一次更新100行,两次更新之间休眠5秒:
batch_update.py
while batch_update.py; do echo 'sleeping...'; sleep 5; done;
使用while:
while true; do echo 'while'; sleep 2s; done
for ((;;)); do echo 'forloop'; sleep 2; done
使用Recursion(与上面略有不同,键盘中断不会阻止它)
Recursion
list(){ echo 'recursion'; sleep 2; list; } && list;
你甚至不需要使用do和done。对于无限循环,我发现使用带花括号的for更具可读性。例如:
do
done
for ((;;)) { date ; sleep 1 ; }
这在bash和zsh中有效。在sh中不起作用。
bash
zsh
sh
您还可以将该循环放在后台(例如,当您需要断开与远程机器的连接时)
nohup bash -c "while true; do aws s3 sync xml s3://bucket-name/xml --profile=s3-profile-name; sleep 3600; done &"