37

如何重复执行一条命令直至运行成功?

 4 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzU3NTgyODQ1Nw%3D%3D&%3Bmid=2247490269&%3Bidx=2&%3Bsn=63c2d1d657fbb2b7386f42b13118bff6
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Y73aamf.jpg!web26fENfN.jpg!web

点击「阅读原文」查看良许原创精品视频。

大家好,我是良许。

在我们的日常工作中,需要我们重复做的工作简直不能太多。比如,我们想要确认网络是否是连通的,传统的做法就是使用 ping 命令不停去测试某个地址(比如百度)。网络比较好还好说,但如果网络很差,那么就需要一直去运行 ping 命令。

作为程序员,重复性的工作怎么能忍呢?只要是重复性的工作,就有可能使用编程的方式来解决!

下面良许就介绍两种方法重复执行一条命令直至运行成功。

(PS:本文适合初学者,高手可绕道)

解决重复性的工作,自然而然会想到 循环 。在 Shell 里,循环无非 3 种: for while until 。在本文里,我们使用后两种循环: while until

关于这两种循环,有编程基础的小伙伴应该是比较熟悉的了,这里再复习一下。

对于 while 循环,在循环条件是 true 的情况下,它会重复执行循环体(包含在 do ... done 结构体里),直到循环条件变成 false 。

而对于 untile 循环,刚好与 while 循环相反,在循环条件是 false 的情况下,它会重复执行循环体(包含在 do ... done 结构体里),直到循环条件变成 true 。

好了,复习完基础知识,我们再来看看如何用这两个循环实现我们的目的。

1. 使用 while 循环

还是以重复测试网络连通性为例。我们可以使用以下命令来解放我们的双手:

$ while ! ping -c 3 baidu.com ; do sleep 2 ; done ; echo succeed

对于这条命令,它将重复执行 ping 命令,如果不成功,则 sleep 2 秒之后继续尝试,直到成功。成功之后,将在终端打印 succeed 字样。

简单介绍:

我们将这个命令分解开,然后简要介绍各个模块的作用。

$ while ! ping -c 3 baidu.com ;

这是循环条件,我们的要求是「当 ping 命令执行失败时,执行循环体」,所以我们要在 ping 之前加一个 !

$ do sleep 2 ; done ;

这部分就是循环体。当循环条件成立时,就进入到循环体。为了不让这个程序抢占太多资源,我们在循环体里睡眠 2 秒。一旦循环条件不成立时,就跳出循环体。

$ echo succeed ;

这部分是跳出循环体之后执行的语句,仅仅是打印一个 succeed 字样,当然你要做其它事也可以。

Nn2UZzM.gif

2. 使用 until 循环

我们使用 until 循环来完成同样的事情,它的写法如下:

$ until ping -c 3 baidu.com ; do sleep 2 ; done ; echo succeed

实现的效果与上面无异,所不同的是,当循环条件为真时,退出循环。

我们也来简单拆解一下。

$ until ping -c 3 baidu.com ;

这部分是循环条件,它将执行 ping 命令,执行结果作为判断依据。直到 ping 命令执行成功时,才退出循环。

$ do sleep 2 ;

循环体,睡眠 2 秒。

$ echo succeed

成功后做的事情。

zEZ73yE.gif

3. 重复执行上个命令直到成功

这里再额外拓展一下,如何重复执行上个命令直到成功?

我们知道,想要重复运行上次的命令,可以使用这个命令:

$ !!

那如何判断上个命令执行是否成功呢?我们可以通过判断 $? 的值是否为 0 来确定。

# while 循环写法
$ !!; while [ $? -ne 0 ]; do !!; done

# until 循环写法
$ until !!; do :; done

本公众号全部博文已整理成一个目录,请在公众号里回复「 m 」获取!

推荐阅读:

这么多编程学习网站,总有一个适合你吧

告诉你一个学习编程的诀窍(建议收藏)

哈哈哈哈,「00 后黑话破解器」火爆 GitHub,这波操作我给满分!

5T技术资源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,单片机,树莓派,等等。在公众号内回复「 1024 」,即可免费获取!!

eyQvie2.jpg!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK