大家好,我是良许。

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

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

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

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

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

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

对于 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 字样,当然你要做其它事也可以。

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

本文来自良许Linux教程网:lxlinux.net

shell中执行某条语句失败能不能重复执行_如何重复执行一条命令直至运行成功?...相关推荐

  1. python重复执行命令_怎样能重复执行一条命令直到运行成功

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

  2. Linux之shell中的case in语句

    文章目录 shell中的case in 语句 1.case in 的用法 2.case in和正则表达式 shell中的case in 语句 1.case in 的用法 格式: 1 | case ex ...

  3. shell中的for循环语句

    shell中的for循环语句 for语句 语法: for 变量 in 值1 值2 值3 -- do 语句 done 机理:把各值依次赋给for后的变量,每赋值一次,便执行一次do与done之间的语句 ...

  4. shell中执行某条语句失败能不能重复执行_如何理解Mysql中的事务隔离级别?

    要说清楚Mysql中的事务隔离级别,我们先从事务的定义说起.事务,是一个或一组sql语句组成的一个执行单元,这个执行单元要么全部执行,要么全部不执行.整个单独单元作为一个不可分割的整体,如果单元中某条 ...

  5. Shell中的case in 语句

    case in 的用法 case expression inpattern 1)statement1;;pattern 2)statement2;; --*)statementn esac 其中:ca ...

  6. python循环输出一句话_执行下列 Python语句后的输出结果是( ),循环执行了 1 次。i=-1;while(i0): i *=iprint(i)_学小易找答案...

    [判断题]我们应该找到一种有益于健康的好方法,那么这种办法一定就是体育锻炼,我们应该将它悄悄带入我们的生活. [单选题]形成阳极效应的原因是 [单选题]有以下程序#include void fun(c ...

  7. mysql执行一条语句会加锁吗_一条简单的更新语句,MySQL是如何加锁的?

    看如下一条sql语句: # table T (id int, name varchar(20)) delete from T where id = 10: MySQL在执行的过程中,是如何加锁呢? 在 ...

  8. shell 中 if判断语句

    shell中的if判断语句分为单分支,双分支,多分支,在java等语句中,if判断后执行的语句块都是用花括号{ }包围的,而在shell脚本中,是if-.fi包围的.具体格式看下面: 一,单分支, i ...

  9. Java中try、finally语句中有return时的执行情况

    在Java中当try.finally语句中包含return语句时,执行情况到底是怎样的,finally中的代码是否执行,大家众说纷纭,有的说会执行,有的说不会执行,到底哪种说法正确,现在通过下面的例子 ...

最新文章

  1. 庆祝杭州移动电视诞生一周年
  2. php静态方法场景,深入介绍PHP中的static的修饰方法和yield的使用场景
  3. ExtJS 4 File Upload + Spring MVC 3 Example
  4. Javascript 事件propagation机制
  5. 恢复Ext3下被删除的文件
  6. ddos攻击工具_简单有效的ddos攻击防御方法
  7. Xampp配置本地域名及常见错误解决
  8. 以我的视角看java编程世界
  9. java number 转 long_Java Number.longValue()用法及代码示例
  10. Mysql学习总结(28)——MySQL建表规范与常见问题
  11. mysql获取当月数据_Python + MySQL如何获取股票数据(历史数据)
  12. 基于Scikit-Learn进行命名实体识别和分类
  13. sqlserver中的函数
  14. php7isapi,WINDOWS 2000下使用ISAPI方式安装PHP
  15. 全球区域区号plist列表(跟微信区号列表数据一致)
  16. 【收藏的一些博客地址-后端开发】
  17. ps—图层、(移动工具中)对齐
  18. 眼镜商城开发,让眼镜世界更丰富
  19. android 通知写法_Android消息通知-Notifation
  20. 调用Android原生裁剪方式裁剪图片并保存

热门文章

  1. opencv保存图像自动命名
  2. erp沙盘采购总监的心得_经验分享 让ERP系统操作少走冤枉路
  3. 农业智慧物联卡火爆发展中存在的问题
  4. php pdo-insert,php mysql pdo insert multiple rows 批量插入
  5. 2021-2022年度第三届全国大学生算法设计与编程挑战赛(冬季赛)-正式赛 部分题解
  6. count是java关键字吗_countinue关键字和break关键字与java基本格式
  7. 计算机一级在线练习,计算机一级练习系统
  8. java类 权限修饰词_java-学习笔记-访问权限修饰词一
  9. Spring 的学习
  10. [云计算]交换机二层端口access、trunk、hybird的理解