-- 作者 谢恩铭 转载请注明出处

内容简介


  1. 前言
  2. while 循环
  3. until 循环
  4. for 循环
  5. 总结
  6. 第五部分第六课预告

1. 前言


上一课 Linux探索之旅 | 第五部分第四课:条件一出,Shell不服 中我们学习了 Shell 中的条件语句。

好吧,我承认,最近几课的标题有点「雷人」...

有了上一课的基础,这一课将是很轻松的。

我们来学习一个所有编程语言都有的要素:循环语句。

循环语句使我们得够重复一个代码块任意多次。这么有用的机制,Shell 语言当然支持。

Shell 中,主要的循环语句有三种:while 循环,until 循环 和 for 循环。我们一一来学习。

2. while 循环


在 Shell 中,我们最常用的循环是 while 循环。

while 是英语「当... 的时候;在… 期间」的意思。

while 循环的逻辑是这样的:

while [ 条件测试 ]
do做某些事
done复制代码

do 是英语「做」的意思。
done 是英语「完成」的意思。

当然了,我们也可以像在 if 语句中那样,把 关键字 do 放到与条件测试同一行上,但是之间要加分号,如下:

while [ 条件测试 ]; do做某些事
done复制代码

while 循环流程图:

while 循环流程图

我们来写一个程序,它会请求用户输入「 yes 」(英语「是」的意思),如果用户没有输入任何字符或者输入的字符串不是 「yes」,那么程序就一直请求。

首先,我们创建一个名叫 「 loop.sh 」的文件( loop 是英语「循环」的意思)。

vim loop.sh复制代码

在这个文件中输入以下内容:

#!/bin/bashwhile [ -z $response ] || [ $response != 'yes' ]
doread -p 'Say yes : ' response
done复制代码

response 是英语「回答」的意思。
say 是英语「说」的意思。

运行:

我们做了两个条件测试:

  • response是否是空 :-z $response
  • response 是否不等于「yes」:$response != 'yes'

因为这两个条件测试之间是用 || (逻辑或)连接的,因此只要两个条件有一个成立,整个条件测试即成立,就会执行 do 和 done 之间的语句。

可以看到,这个程序非常「任性」,只要我们输入的不是「 yes 」,它就不停止输出「 Say yes : 」。真是「咄咄逼人」...

3. until 循环


与 while 这个关键字相反的有一个 until 关键字,until 在英语中是 「直到」的意思。

它也可以实现循环,只不过逻辑和 while 循环正好相反。

until 循环流程图:

until 循环流程图

我们可以用 until 来改写一下上面的程序:

#!/bin/bashuntil [ "$response" = 'yes' ]
doread -p 'Say yes : ' response
done复制代码

运行结果和 while 循环那个是一样的。

4. for 循环


for 是英语「对于」的意思。

首先,我们要提醒已经学过主流编程语言(如 C语言,Java,等等)的读者,Shell 中的 for 循环和你已经习惯的 for 循环方式略有不同。

我们一起来学习吧。

遍历列表


for 循环可以遍历一个「取值列表」,基本的逻辑如下:

for 变量 in '值1' '值2' '值3' ... '值n'
do做某些事
done复制代码

in 是英语「在... 之中」的意思。

for 循环流程图:

for 循环流程图

我们来写一个例子:

#!/bin/bashfor animal in 'dog' 'cat' 'pig'
doecho "Animal being analyzed : $animal"
done复制代码

「 Animal being analyzed 」是英语「正在被分析的动物」的意思。

运行:

可以看到,animal 这个变量依次取了 'dog'(狗), 'cat'(猫), 'pig'(猪) 这三个值。

for 循环的取值列表不一定要在代码中定义好,我们也可以用一个变量,如下例:

#!/bin/bashlistfile=`ls`for file in $listfile
doecho "File found : $file"
done复制代码

「 File found 」是英语「找到的文件」的意思。

运行:

如你所见,上面的程序列出了当前目录下所有的文件。

我们还可以简化上面的程序,不需要用到 listfile 这个变量:

#!/bin/bashfor file in `ls`
doecho "File found : $file"
done复制代码

我们可以再改进这个程序,让它复制当前目录下的文件,并且把每个副本的名字修改为「现有名字 + -copy」 (copy 是英语「拷贝」的意思):

#!/bin/bashfor file in `ls`
docp $file $file-copy
done复制代码

运行:

可见,Shell 非常强大。

更常规的 for 循环


刚才我们看到的 for 循环,和主流编程语言中的语法略有不同,不过我们可以借助 seq 命令,来实现类似主流编程语言中的 for 循环的语法。

seq 是 sequence 的缩写,是英语「序列」的意思。

来写一个例子:

#!/bin/bashfor i in `seq 1 10`
doecho $i
done复制代码

运行:

以上程序中,「 seq 1 10 」会返回一个取值列表,是从 1 到 10 的整数值。因此,echo 就会遍历输出 1 到 10 这 10 个整数。

我们也可以修改默认的取值间隔 ( 1 ),改成我们需要的数值,如下:

#!/bin/bashfor i in `seq 1 2 10`
doecho $i
done复制代码

运行:

以上程序中,「 seq 1 2 10 」会返回一个取值列表,是从 1 到 10 的整数值,但是取值间隔是 2,echo 就会遍历输出 1 到 10 这 10 个整数中的 1,3,5,7,9 这5个整数。

5. 总结


  1. 我们使用循环语句来重复执行一系列指令。

  2. while 循环在条件满足的情况下可以一直重复执行。其中的条件测试语句的机制和上一课的条件语句中的一样。

  3. until 循环和 while 循环的逻辑正好相反。

  4. for 循环可以遍历一个「取值列表」,来依次执行相应的指令。在 for 循环内部,变量的取值会逐步变化。

6. 第五部分第六课预告


今天的课就到这里,一起加油吧!

下一课我们学习:一朝Shell函数倾,斗转星移任我行


微信公众号「程序员联盟」ProgrammerLeague
我是谢恩铭,在巴黎奋斗的软件工程师。
我的简介
我的经历
热爱生活,喜欢游泳,略懂烹饪。
人生格言:“向着标杆直跑”

Linux 探索之旅 | 第五部分第五课:循环往复,Shell 开路相关推荐

  1. 【Linux探索之旅】第二部分第五课:用户和权限,有权就任性

    内容简单介绍 1.第二部分第五课:用户和权限,有权就任性 2.第二部分第六课预告:Nano,刚開始学习的人的文本编辑器 用户和权限.有权就任性 今天的标题也挺任性的啊,虽说小编是一个非常本分的人(真的 ...

  2. Linux 探索之旅 | 第三部分第五课:延时执行,唯慢不破

    -- 作者 谢恩铭 转载请注明出处 内容简介 第三部分第五课:延时执行,唯慢不破 第三部分第六课预告:第三部分测验题 延时执行,唯慢不破 上一课 Linux探索之旅 | 第三部分第四课:后台运行及合并 ...

  3. Linux 探索之旅 | 第三部分第四课:后台运行及合并多个终端

    -- 作者 谢恩铭 转载请注明出处 内容简介 第三部分第四课:后台运行及合并多个终端 第三部分第五课预告:延时执行,唯慢不破 后台运行及合并多个终端 上一课 Linux探索之旅 | 第三部分第三课:监 ...

  4. 【Linux探索之旅】第二部分第三课:文件和文件夹,组织不会亏待你

    内容简单介绍 1.第二部分第三课:文件和文件夹,组织不会亏待你 2.第二部分第四课预告:文件操纵.鼓掌之中 文件和文件夹,组织不会亏待你 上一次课我们讲了命令行,这将成为伴随我们接下来整个Linux课 ...

  5. 【Linux探索之旅】第一部分第四课:磁盘分区,并完毕Ubuntu安装

    内容简单介绍 1.第一部分第四课:磁盘分区,并完毕Ubuntu安装 2.第一部分第五课预告:Unity桌面,人生若仅仅如初见 磁盘分区 上一课我们正式開始安装Ubuntu了.可是到了分区的那一步.小编 ...

  6. Linux 探索之旅 | 第四部分第二课:SSH 连接,安全快捷

    -- 作者 谢恩铭 转载请注明出处 内容简介 第四部分第二课:SSH连接,安全快捷 第四部分第三课预告:文件传输,潇洒同步 SSH连接,安全快捷 上一课是 Linux探索之旅 | 第四部分第一课:压缩 ...

  7. Linux 探索之旅 | 第五部分第六课:一朝 Shell 函数倾,斗转星移任我行

    -- 作者 谢恩铭 转载请注明出处 内容简介 前言 函数的作用 函数的定义 传递参数 返回值 变量作用范围 重载命令 函数的设计 总结 第五部分第七课预告 1. 前言 上一课 Linux探索之旅 | ...

  8. Linux 探索之旅 | 第五部分第八课:用 Shell 做统计练习

    -- 作者 谢恩铭 转载请注明出处 <Linux探索之旅>全系列 内容简介 前言 成果展示 解题步骤和答案 可能的优化 第五部分第九课预告 1. 前言 上一课 Linux探索之旅 | 第五 ...

  9. Linux 探索之旅 | 第一部分第四课:磁盘分区 + 完成 Ubuntu 安装

    -- 作者 谢恩铭 转载请注明出处 内容简介 第一部分第四课:磁盘分区+完成Ubuntu安装 第一部分第五课预告:Unity桌面,人生若只如初见 磁盘分区+完成Ubuntu安装 上一课Linux探索之 ...

最新文章

  1. Git GUI使用(二)
  2. 生成对象---工厂方法模式
  3. python输入以及比较逻辑运算符介绍(含笔记)
  4. java如何实现不固定个数传参
  5. HttpServletRequest和ServletRequest的区别
  6. select 存储过程 mysql_MySQL存储过程无法使用SELECT(基本问题)
  7. 【Asp.Net从零开始】:使用缓存来提高网站性能 Caching(一)
  8. 计算机毕业设计之流浪宠物管理系统
  9. 运放输入偏置电流方向_运算放大器+仪表放大器:如何为偏置电流提供直流回路?...
  10. 微信 vue html缓存,解决微信浏览器缓存站点入口文件(IIS部署Vue项目)_唇印_前端开发者...
  11. 浩方对战平台原理分析
  12. 优动漫PAINT下载的素材找不到怎么办?
  13. Oracle删除数据消耗时间大吗,oracle 删除大量数据的方法
  14. JSP常用内置对象及抽奖功能
  15. I帧和IDR帧的区别
  16. Three.js 学习历程与总结
  17. 操作系统银行家算法计算机四级,【NCRE四级网络工程师】操作系统多选题
  18. c语言调用calculate函数,关于c语言中int calculate函数求解。谢谢
  19. Python爬虫获取股票信息代码分享
  20. 聚亿美匠心时代,聚亿美用心打造未来

热门文章

  1. 三角窗 matlab,【matlab】矩形窗/三角窗/hanning窗/hamming窗/blackman窗的頻率響應圖
  2. 爬虫学习笔记(十九)—— 滑动验证码
  3. h5 socket.io java,从HTML5 WebSocket到Socket.io
  4. 分析Kotlin协程只挂起不恢复会怎样(是否存在协程泄漏),以及挂起的协程存在哪里?
  5. yii表单ajax验证,yii2 modal弹窗之ActiveForm ajax表单异步验证
  6. python模型训练效果没有优化_LSTM模型训练效果好,但测试结果较差,不能看出拟合过度...
  7. 获取视频的每一帧,并保存为.jpg图片
  8. 2、UNIX、Linux操作系统的发展历程、介绍、应用领域
  9. 【自动驾驶】17. pitch yaw roll是什么
  10. 吴恩达的视频课程做成了文字版 ~~~