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

你们好,我是良许。linux

在咱们的平常工做中,须要咱们重复作的工做简直不能太多。好比,咱们想要确认网络是不是连通的,传统的作法就是使用 ping 命令不停去测试某个地址(好比百度)。网络比较好还好说,但若是网络不好,那么就须要一直去运行 ping 命令。程序员

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

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

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

解决重复性的工做,天然而然会想到循环 。在 Shell 里,循环无非 3 种:forwhileuntil 。在本文里,咱们使用后两种循环:whileuntil网络

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

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

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

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

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 字样,固然你要作其它事也能够。

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

成功后作的事情。

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

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

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

$ !!

那如何判断上个命令执行是否成功呢?咱们能够经过判断 $? 的值是否为 0 来肯定。

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

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

看完的都是真爱,点个赞再走呗?您的「三连」就是良许持续创做的最大动力!

  1. 关注原创公众号「良许Linux」,第一时间获取最新Linux干货!
  2. 公众号后台回复【资料】【面试】【简历】获取精选一线大厂面试、自我提高、简历等资料。
  3. 关注个人博客:lxlinux.net
相关文章
相关标签/搜索