Bash 流程控制

王 茂南 2022年3月3日07:26:44
评论
2473字阅读8分14秒
摘要本文介绍 bash 流程控制。主要包括,条件判断(if ,elif,else)。循环结构(for 循环和 while 循环)。循环控制(while 和 break)。

简介

本文介绍 shell 脚本中的流程控制,其中包括了条件判断,分支结构以及循环结构的流程控制语句(这里的流程控制语句和其他编程语言类似,看得时候可以进行类比学习)。包含以下的知识点:

  • 条件判断:
    • 单分支结构-if 语句;
    • 多分支结构-elif/else;
  • 循环结构:
    • For 循环
      • 列表 for 循环;
      • 类似 C 语言风格的 for 循环;
    • while 循环;
    • select 循环;
  • 循环控制
    • break 和 continue 的使用;

 

条件判断

条件判断是在程序执行时,根据不同的条件,选择执行不同的程序语句。通常包括「单分支结构」和「多分支结构」。单分支结构就是只判断一种情况,多分支结构就是判断多种情况。

单分支结构-if 语句

最常见的判断语句就是 if ... then,当满足条件就执行操作命令,fi 表示结束。下面是他的语法(需要注意 then 前面是有分号的):

  1. if 表达式 ;then
  2.     操作
  3. fi

下面我们来看一个例子,输入一个数字,判断这个数值时候大于 7:

  1. #!/bin/bash
  2. read -p "INput num: " a
  3. if (( $a > 7)); then
  4.     echo $a "is larger than 7"
  5. fi

运行上面的代码,输入数值 9,可以看到输入是大于 7。

Bash 流程控制

 

多分支结构-elif/else

上面的例子只是当我们输入的数字大于 7 才会输出一些内容,当我们想要再输入的数字等于 7 或者小于 7 时,也能给出一些提示信息的话,就需要对多种情况进行判断,此时我们就需要使用下面讲解的两种结构。

我们使用 elif/else 来实现「多分支」。下面是基本的语法(需要注意 then 前面是有分号的):

  1. if 表达式1 ;then
  2. 操作1
  3. elif 表达式2 ;then
  4. 操作2
  5. elif 表达式3 ;then
  6. 操作3
  7. ...
  8. else
  9. 操作4
  10. fi

如果「表达式1」的结果为真,则执行「操作1」,如果「表达式2」的结果为真,则执行「操作2」,依次类推,如果所有条件都不符合,则执行 else 后面的「操作4」 。同样也是以 fi 结束。

下面我们来看一个例子,输入一个数值,当「大于/小于/等于 7」的时候给出对应的提示。这里直接贴代码的截图,这样会有高亮:

Bash 流程控制

我们运行上面的脚本,分别测试三种情况,结果如下所示:

Bash 流程控制

当然也可以将上面的 (()) 使用 [[]],需要注意 [[]] 与后面的元素需要有空格。

Bash 流程控制

这里 (()) 和 [[]] 的使用情况分别是:

  • 使用 [[]]
    • 有 -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 循环的语法如下:

  1. for 循环变量 in 列表
  2. do字符串
  3.     操作
  4. done

其中:

  • do 和 done 之间的命令称为循环体,执行次数和列表中常数或字符串的个数相同。
  • for 循环首先将 in 后列表的第一个常数或字符串赋值给循环变量,然后执行循环体,再取列表中第二个值赋值给循环变量,然后执行循环体,以此类推。
  • bash 支持列表 for 循环使用略写的计数方式,1~10 的范围用 {1..10} 表示(大括号不能去掉,否则会当作一个字符串处理)。
  • bash 中还支持按规定的步数进行跳跃的方式实现列表 for 循环,例如计算1~100内所有的偶数之和。

【例子一】下面看一个例子,我们想要输入 0-10 之间所有数进行求和的结果。

Bash 流程控制

需要注意,运算命令需要使用 (()),例如第三行的赋值,循环里面的求和。最终运行输出结果如下所示,求和的结果是 55

Bash 流程控制

【例子二】当然我们可以写成一个列表,如下所示。这里这里不需要使用逗号将数值隔开:

Bash 流程控制

 

类似 C 语言风格的 for 循环

我们直接来看一个例子。计算 0-10 之间所有数的和。于是可以写成下面的样子:

Bash 流程控制

下面的例子,打印出 0-10 之间,每隔数值 3 打印一次:

Bash 流程控制

 

While 循环

while 循环利用一个条件来控制是否继续重复执行某个操作。为了避免死循环,必须保证循环体中包含退出循环的条件。while 循环的语法如下所示:

  1. while 判断表达式
  2. do
  3.     操作
  4. done

我们还是来看一个例子,使用 while 循环来计算 0-10 之间所有偶数的和。他的代码如下所示:

Bash 流程控制

 

 

Select 循环

还有一种循环是 select 循环。它主要是提供一种创建具有编号的菜单的方法。就像我们平时出去吃饭一样,店家制定一个菜单供我们点菜。首先看一下他的语法:

  1. select 变量名 in [ 菜单取值列表 ]
  2. do
  3.     操作
  4. done

下面看一个具体的例子。我们创建一个菜单选项,并打印出我们选择的字符串。如果选择的是 hello,就会退出这个循环(注意下面「中括号」和「变量」之间需要有空格):

Bash 流程控制

运行上面的代码,效果如下。可以看到首先会打印出全部的选项,我们选择哪个就会打印哪个。选择到 hello,就会退出循环。

Bash 流程控制

 

循环控制

break 命令

break 强制跳出所有循环,终止整个循环的执行。它可以跳出 for、while、until 等循环。下面看一个例子,但输入数值大于 10 的时候,就自动退出循环:

Bash 流程控制

运行上面的代码,可以看到输入大于 10 的数值会退出:

Bash 流程控制

 

continue 命令

continue 也是用于强制跳出循环,不过它主要是跳出当前循环,不会跳出所有循环,也就是后面的循环在正常情况下依旧能执行。

下面我们利用 continue 来计算 0-100 内所有偶数的和。我们利用 continue 跳过所有的奇数。

Bash 流程控制

  • 微信公众号
  • 关注微信公众号
  • weinxin
  • QQ群
  • 我们的QQ群号
  • weinxin
王 茂南
  • 本文由 发表于 2022年3月3日07:26:44
  • 转载请务必保留本文链接:https://mathpretty.com/15255.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: