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

系统 Linux
作为程序员,重复性的工作怎么能忍呢?只要是重复性的工作,就有可能使用编程的方式来解决!下面良许就介绍两种方法重复执行一条命令直至运行成功。

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

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

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

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

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

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

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

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

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

1. 使用 while 循环

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

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

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

简单介绍:

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

  1. $ while ! ping -c 3 baidu.com ; 

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

  1. $ do sleep 2 ; done ; 

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

  1. $ echo succeed ; 

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

2. 使用 until 循环

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

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

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

我们也来简单拆解一下。

  1. $ until ping -c 3 baidu.com ; 

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

  1. $ do sleep 2 ; 

循环体,睡眠 2 秒。

  1. $ echo succeed 

成功后做的事情。

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

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

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

  1. $ !! 

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

  1. # while 循环写法 
  2. $ !!; while [ $? -ne 0 ]; do !!; done 
  3.  
  4. # until 循环写法 
  5. $ until !!; do :; done 

本文授权转载自公众号「良许Linux」。良许,世界500强外企Linux开发工程师,公众号里分享大量Linux干货,欢迎关注!

 

责任编辑:赵宁宁 来源: 良许Linux
相关推荐

2022-02-11 14:43:53

SQL语句C/S架构

2015-07-28 11:06:28

日志记录Linux命令

2023-02-26 23:31:01

SQL数据库

2011-03-21 17:19:12

LAMPUbuntu

2009-08-05 10:43:19

CISSPBCPDRP

2021-12-02 15:30:55

命令内存Linux

2021-06-03 06:52:11

Redis服务器命令

2021-06-07 08:37:03

SQL 查询语句

2021-06-30 07:47:03

Linux CPULinux 系统

2022-05-31 13:58:09

MySQL查询语句

2018-08-14 08:43:17

服务器命令CCS系统

2024-02-20 13:43:12

2024-04-19 07:31:58

MySQL数据库

2011-03-16 16:48:32

iptables 清空

2022-01-01 18:26:21

nginx

2024-02-01 18:07:37

2010-04-13 16:57:01

2021-08-03 08:41:18

SQLMysql面试

2023-11-01 16:50:58

2021-02-15 15:07:45

Windows 10Windows微软
点赞
收藏

51CTO技术栈公众号