文章目录(Table of Contents)
简介
本文介绍 shell
脚本中的流程控制,其中包括了条件判断,分支结构以及循环结构的流程控制语句(这里的流程控制语句和其他编程语言类似,看得时候可以进行类比学习)。包含以下的知识点:
- 条件判断:
- 单分支结构-if 语句;
- 多分支结构-elif/else;
- 循环结构:
- For 循环
- 列表 for 循环;
- 类似 C 语言风格的 for 循环;
- while 循环;
- select 循环;
- For 循环
- 循环控制
- break 和 continue 的使用;
条件判断
条件判断是在程序执行时,根据不同的条件,选择执行不同的程序语句。通常包括「单分支结构」和「多分支结构」。单分支结构就是只判断一种情况,多分支结构就是判断多种情况。
单分支结构-if 语句
最常见的判断语句就是 if ... then
,当满足条件就执行操作命令,fi
表示结束。下面是他的语法(需要注意 then
前面是有分号的):
- if 表达式 ;then
- 操作
- fi
下面我们来看一个例子,输入一个数字,判断这个数值时候大于 7:
- #!/bin/bash
- read -p "INput num: " a
- if (( $a > 7)); then
- echo $a "is larger than 7"
- fi
运行上面的代码,输入数值 9,可以看到输入是大于 7。
多分支结构-elif/else
上面的例子只是当我们输入的数字大于 7
才会输出一些内容,当我们想要再输入的数字等于 7
或者小于 7
时,也能给出一些提示信息的话,就需要对多种情况进行判断,此时我们就需要使用下面讲解的两种结构。
我们使用 elif/else
来实现「多分支」。下面是基本的语法(需要注意 then
前面是有分号的):
- if 表达式1 ;then
- 操作1
- elif 表达式2 ;then
- 操作2
- elif 表达式3 ;then
- 操作3
- ...
- else
- 操作4
- fi
如果「表达式1」的结果为真,则执行「操作1」,如果「表达式2」的结果为真,则执行「操作2」,依次类推,如果所有条件都不符合,则执行 else
后面的「操作4」 。同样也是以 fi
结束。
下面我们来看一个例子,输入一个数值,当「大于/小于/等于 7」的时候给出对应的提示。这里直接贴代码的截图,这样会有高亮:
我们运行上面的脚本,分别测试三种情况,结果如下所示:
当然也可以将上面的 (())
使用 [[]]
,需要注意 [[]]
与后面的元素需要有空格。
这里 (())
和 [[]]
的使用情况分别是:
- 使用
[[]]
:- 有 -eq 表示等于;-ne 表示部分与;-gt 表示大于;-ge 表示大于等于;-lt 表示小于;-le 表示小于等于;
- 例如可以写成
if [[ $a -ne 7 ]]
- 使用
(())
:- 可以直接使用数学符号,也就是,<,>,>=,<=
- 例如可以写成
if ((a>7))
循环结构
在编写脚本时会遇到要重复执行一段代码很多次或上百上千次,这种时候设定成循环语句来实现就会简单很多了。常用的循环语句有下面几种:
- for 循环,while 循环(满足条件才执行操作);
- until 循环(先执行操作,再判断时候满足条件);
- select 循环(提供创建具有编号的菜单的方法);
for 循环
for
循环有三种结构,分别是:
- 列表 for 循环
- 不带列表的 for 循环(这里我们不作介绍)
- 类似 C 语言风格的 for 循环
下面会对上面的两种结构进行介绍(其中不带列表的 for 循环就不在这里介绍了)。
列表 for 循环
列表 for
循环的语法如下:
- for 循环变量 in 列表
- do字符串
- 操作
- done
其中:
do
和done
之间的命令称为循环体,执行次数和列表中常数或字符串的个数相同。for
循环首先将 in 后列表的第一个常数或字符串赋值给循环变量,然后执行循环体,再取列表中第二个值赋值给循环变量,然后执行循环体,以此类推。bash
支持列表for
循环使用略写的计数方式,1~10 的范围用{1..10}
表示(大括号不能去掉,否则会当作一个字符串处理)。bash
中还支持按规定的步数进行跳跃的方式实现列表for
循环,例如计算1~100内所有的偶数之和。
【例子一】下面看一个例子,我们想要输入 0-10
之间所有数进行求和的结果。
需要注意,运算命令需要使用 (())
,例如第三行的赋值,循环里面的求和。最终运行输出结果如下所示,求和的结果是 55
:
【例子二】当然我们可以写成一个列表,如下所示。这里这里不需要使用逗号将数值隔开:
类似 C 语言风格的 for 循环
我们直接来看一个例子。计算 0-10
之间所有数的和。于是可以写成下面的样子:
下面的例子,打印出 0-10
之间,每隔数值 3 打印一次:
While 循环
while 循环利用一个条件来控制是否继续重复执行某个操作。为了避免死循环,必须保证循环体中包含退出循环的条件。while 循环的语法如下所示:
- while 判断表达式
- do
- 操作
- done
我们还是来看一个例子,使用 while 循环来计算 0-10
之间所有偶数的和。他的代码如下所示:
Select 循环
还有一种循环是 select 循环。它主要是提供一种创建具有编号的菜单的方法。就像我们平时出去吃饭一样,店家制定一个菜单供我们点菜。首先看一下他的语法:
- select 变量名 in [ 菜单取值列表 ]
- do
- 操作
- done
下面看一个具体的例子。我们创建一个菜单选项,并打印出我们选择的字符串。如果选择的是 hello
,就会退出这个循环(注意下面「中括号」和「变量」之间需要有空格):
运行上面的代码,效果如下。可以看到首先会打印出全部的选项,我们选择哪个就会打印哪个。选择到 hello
,就会退出循环。
循环控制
break 命令
break
强制跳出所有循环,终止整个循环的执行。它可以跳出 for、while、until 等循环。下面看一个例子,但输入数值大于 10 的时候,就自动退出循环:
运行上面的代码,可以看到输入大于 10 的数值会退出:
continue 命令
continue
也是用于强制跳出循环,不过它主要是跳出当前循环,不会跳出所有循环,也就是后面的循环在正常情况下依旧能执行。
下面我们利用 continue
来计算 0-100
内所有偶数的和。我们利用 continue
跳过所有的奇数。
- 微信公众号
- 关注微信公众号
- QQ群
- 我们的QQ群号
评论