Bash中单行while循环的语法
我很难找到分号和/或大括号的正确组合。我想这样做,但作为命令行的一行程序:Bash中单行while循环的语法,bash,loops,while-loop,Bash,Loops,While Loop,我很难找到分号和/或大括号的正确组合。我想这样做,但作为命令行的一行程序: while [ 1 ] do foo sleep 2 done 顺便说一句,如果在命令提示下以多行形式(如图所示)键入它,然后使用向上箭头调用历史记录,则会在一行中正确地添加标点 $ while true > do > echo "hello" > sleep 2 > done hello hello hello ^C $ <arrow up> while
while [ 1 ]
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
$while true
>做
>回音“你好”
>睡眠2
>完成
你好
你好
你好
^C
$虽然正确;重复“你好”;睡眠2;完成
您可以使用分号分隔语句:
$ 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 rm -r $f; fi; done
只是想做出贡献。在while的情况下也可以使用sleep命令。使一个衬里看起来更干净
while sleep 2; do echo thinking; done
冒号总是“true”:
您还可以使用
until
命令:
until ((0)); do foo; sleep 2; done
请注意,与while
相反,只要测试条件的退出状态不为零,直到
将在循环内执行命令
使用
while
循环:
while read i; do foo; sleep 2; done < /dev/urandom
for ((;;)); do foo; sleep 2; done
另一种方法是使用
直到:
until [ ]; do foo; sleep 2; done
一个非常简单的无限循环:)
你的问题是:
while true; do foo ; sleep 2 ; done
对于简单的过程监视,请使用监视代替您也可以尝试此方法
警告:您不应该这样做,但因为问题是要求无限循环没有结束…这是您可以做到的
while [[ 0 -ne 1 ]]; do echo "it's looping"; sleep 2; done
如果希望while循环在某个条件后停止,并且当满足此条件时,foo
命令返回非零,则可以使循环按如下方式中断:
whilefoo;做“睡觉…”;睡眠5;完成;
例如,如果foo
命令正在批量删除内容,并且当没有要删除的内容时返回1
如果您有一个自定义脚本,需要多次运行命令,直到出现某种情况,那么这种方法很有效。编写脚本以在满足条件时使用1
退出,并在应再次运行时使用0
退出
例如,假设您有一个python脚本batch_update.py
,它更新数据库中的100行,如果有更多行要更新,则返回0
,如果没有更多行,则返回1
。以下命令将允许您一次更新行100,并在更新之间休眠5秒:
而batch_update.py;做“睡觉…”;睡眠5;完成;
在使用的同时
:
while true; do echo 'while'; sleep 2s; done
对循环使用:
for ((;;)); do echo 'forloop'; sleep 2; done
使用递归
,(与上面稍有不同,键盘中断不会阻止它)
您甚至不需要使用do
和done
。对于无限循环,我发现使用带花括号的For
更具可读性。例如:
for ((;;)) { date ; sleep 1 ; }
这适用于bash
和zsh
。不适用于sh
用分号替换换行符。对于for循环也是一样。@Tom:这并不总是有效的。在do之后,您必须有第一个命令,而不是分号“如果您在命令提示符下以多行形式键入它(如您正在显示的),然后使用向上箭头调用历史记录,您将在一行上获得它,并正确地加标点。”这对我来说不是真的。@VincentScheib,如果您使用的是bash,请选中cmdhist
选项。太好了!可以在Mavericks(MacOS-X10.9)上完美运行,并允许我保持vpn运行。Openconnect在几个小时后由于错误的cookie错误而断开连接。所以我将openconnect命令放在一个shell脚本中,sudosu变成root,并使用cmd行:while true;do sh/Users/myuser/bin/vpn;完成
为什么冒号总是正确的?@spineapple Under the Sea:来自bash手册页:(在SHELL内置命令部分):[arguments]
无效;该命令除了扩展参数和执行任何指定的重定向之外,什么都不做。返回零退出代码。建议使用此语法,因为:是shell本身的一部分,即:是shell内置命令。@JKnight-对于这些示例,您是否只需执行ls-1*.jpg
和rm*.jpg
都不是无限循环,也不是while循环。嗯,在循环中使用&&
与其他时间是一样的,不是吗。您是否只需要在第一件事情发生时才需要第二件事情发生,然后使用&&
else代码>足够了。实际上,您希望使循环的内容保持简短,理想情况下只需一个命令,即一个函数或一个脚本。在sleep
中小心使用单元,如sleep 1h
。在我的zsh中,它忽略单位h
,并每1秒运行一次我的命令。首先快速执行人工睡眠
以查看环境的睡眠
命令支持什么。也许可以让你不头疼。谢谢你。我一直在寻找一种正确的方式来运行“do”中的不止一件事情。这不仅仅是改变语法——它将在睡眠后执行命令。在前面的回答中,立即执行命令。只是需要注意一下。@DanGordon,同时回应思考;做睡眠2;完成
当然,如果[while]命令失败,循环将退出,因此您必须在echo thinking | | true;做睡眠2;完成
,然后返回到,而为true你为什么要这样做?因为布莱恩·迪肯发布了这个问题,就像一个infinte循环。这不仅仅是一种剥猫皮的方法,这就是为什么你不应该这样做?我喜欢这个答案,因为它解释了什么时候和为什么;(分号)是必需的。您将如何退出?当您需要whi时,使用code1
命令退出foo
while [[ 0 -ne 1 ]]; do echo "it's looping"; sleep 2; done
while true; do echo 'while'; sleep 2s; done
for ((;;)); do echo 'forloop'; sleep 2; done
list(){ echo 'recursion'; sleep 2; list; } && list;
for ((;;)) { date ; sleep 1 ; }