Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash中单行while循环的语法_Bash_Loops_While Loop - Fatal编程技术网

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;完成
,然后返回到
,而为true1
命令退出
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 ; }