你们好,我是良许。linux
在咱们的平常工做中,须要咱们重复作的工做简直不能太多。好比,咱们想要确认网络是不是连通的,传统的作法就是使用 ping
命令不停去测试某个地址(好比百度)。网络比较好还好说,但若是网络不好,那么就须要一直去运行 ping
命令。程序员
做为程序员,重复性的工做怎么能忍呢?只要是重复性的工做,就有可能使用编程的方式来解决!面试
下面良许就介绍两种方法重复执行一条命令直至运行成功。编程
(PS:本文适合初学者,高手可绕道)
解决重复性的工做,天然而然会想到循环
。在 Shell 里,循环无非 3 种:for
、while
、until
。在本文里,咱们使用后两种循环:while
、until
。网络
关于这两种循环,有编程基础的小伙伴应该是比较熟悉的了,这里再复习一下。测试
对于 while
循环,在循环条件是 true 的状况下,它会重复执行循环体(包含在 do ... done
结构体里),直到循环条件变成 false 。spa
而对于 untile
循环,恰好与 while
循环相反,在循环条件是 false 的状况下,它会重复执行循环体(包含在 do ... done
结构体里),直到循环条件变成 true 。.net
好了,复习完基础知识,咱们再来看看如何用这两个循环实现咱们的目的。code
仍是以重复测试网络连通性为例。咱们可使用如下命令来解放咱们的双手:资源
$ 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 字样,固然你要作其它事也能够。
咱们使用 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
成功后作的事情。
这里再额外拓展一下,如何重复执行上个命令直到成功?
咱们知道,想要重复运行上次的命令,可使用这个命令:
$ !!
那如何判断上个命令执行是否成功呢?咱们能够经过判断 $?
的值是否为 0 来肯定。
# while 循环写法 $ !!; while [ $? -ne 0 ]; do !!; done # until 循环写法 $ until !!; do :; done