bash之流程控制

一.if else                

和 Java、PHP 等语言不一样,sh 的流程控制不可为空

在 sh/bash 里可不能这么写,如果 else 分支没有语句执行,就不要写这个 else。

if 语句语法格式:

if condition
thencommand1command2...commandN
fi

if else
if else 语法格式:

if condition
thencommand1command2...commandN
elsecommand
fi

if-elif-else 语法格式:

if condition1
thencommand1
elif condition2
thencommand2
elsecommandN
fi

以下实例判断两个变量是否相等:

a=10
b=20
if [ $a == $b ]
thenecho "a == b"
elif [ $a -gt $b ]
thenecho "a > b"
elif [ $a -lt $b ]
thenecho "a < b"
elseecho "Ineligible"
fi

输出结果:

a < b

if else 语句经常与 test 命令结合使用

num1=$[2*3]
num2=$[1+5]
if test $[num1] -eq $[num2]
thenecho 'Two numbers are equal!'
elseecho 'The two numbers are not equal!'
fi

输出结果:

Two numbers are equal!

二.for 循环

for var in item1 item2 ... itemN
docommand1command2...commandN
done

例如,顺序输出当前列表中的数字:

for loop in 1 2 3 4 5
doecho "The value is: $loop"
done

输出结果:

The value is: 1

The value is: 2

The value is: 3

The value is: 4

The value is: 5

顺序输出字符串中的字符:

for str in This is a string
doecho $str
done

输出结果:

This

is

a

string

三.while 语句

        while 循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。其格式为:

while condition
docommand
done
#!/bin/bash
int=1
while(( $int<=5 ))
doecho $intlet "int++"
done

运行脚本,输出:

1

2

3

4

5

        如果 int 小于等于 5,那么条件返回真。int 从 1 开始,每次循环处理时,int 加 1。运行上述脚本,返回数字 1 到 5,然后终止。

        使用了 Bash let 命令,它用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量。

        while 循环可用于读取键盘信息。下面的例子中,输入信息被设置为变量 MAN,按 <Ctrl+D> 结束循环。

echo 'press <CTRL-D> exit'
echo -n 'Who do you think is the most handsome: '
while read MAN
doecho "Yes! $MAN is really handsome"
done

四.无限循环

无限循环语法格式:

while :
docommand
done
或者
while true
docommand
done

或者:

for (( ; ; ))

五.until 循环

        until 循环执行一系列命令直至条件为真时停止。 until 循环与 while 循环在处理方式上刚好相反。 一般 while 循环优于 until 循环,但在某些时候—也只是极少数情况下,until 循环更加有用。 until 语法格式:

until condition
docommand
done

        条件可为任意测试条件,测试发生在循环末尾,因此循环至少执行一次—请注意这一点。

六.case

        Shell case 语句为多选择语句。可以用 case 语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。case 语句格式如下:

case 值 in
模式1)command1command2...commandN;;
模式2)command1command2...commandN;;
esac

        取值后面必须为单词 in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。
        取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。
        下面的脚本提示输入 1 到 4,与每一种模式进行匹配:

echo 'Enter a number between 1 and 4:'
echo 'The number you entered is:'
read aNum
case $aNum in1)  echo 'You have chosen 1';;2)  echo 'You have chosen 2';;3)  echo 'You have chosen 3';;4)  echo 'You have chosen 4';;*)  echo 'You did not enter a number between 1 and 4';;
esac

输入不同的内容,会有不同的结果,例如:

Enter a number between 1 and 4:
The number you entered is:
3
You have chosen 3

        在这段 Bash 脚本中,`;;`和`*)`具有以下特定用途:

        一、`;;`的作用1. 结束分支: - 在 `case` 语句中,每个分支以 `;;` 作为结束标志。 - 当某个条件匹配并执行完对应分支的命令后,遇到 `;;` 就表示这个分支的处理结束,不会继续执行后续的分支。 - 例如在 `1|2|3|4|5) echo "The number you entered is $aNum!" ;;` 这个分支中,当输入的数字是 1、2、3、4 或 5 时,打印相应的提示信息,然后 `;;` 表示这个分支处理完毕。

        二、`*)`的作用1. 处理默认情况: - 在 `case` 语句中,`*)` 表示默认分支,用于处理所有未被前面特定条件匹配的情况。 - 当输入的数字不是 1 到 5 之间的任何一个数字时,就会执行这个默认分支。 - 例如在 `*) echo "The number you entered is not between 1 and 5! game over!" ; break ;;` 中,如果用户输入的数字不在 1 到 5 的范围内,就会打印错误提示信息 “The number you entered is not between 1 and 5! game over!”,然后执行 `break` 语句跳出循环。

        总的来说,`;;` 和 `*)` 在 `case` 语句中起到了明确分支结束和处理默认情况的重要作用,使脚本能够根据不同的输入进行相应的处理。

七.跳出循环

        在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,Shell 使用两个命令来实现该功能:break 和 continue。

break 命令

break 命令允许跳出所有循环(终止执行后面的所有循环)。

        下面的例子中,脚本进入死循环直至用户输入数字大于 5。要跳出这个循环,返回到 shell 提示符下,需要使用 break 命令。

#!/bin/bash
while :
doecho -n "Enter a number between 1 and 5:"read aNumcase $aNum in1|2|3|4|5) echo "The number you entered is $aNum!";;*) echo "The number you entered is not between 1 and 5! game over!"break;;esac
done

执行以上代码,输出结果为:

Enter a number between 1 and 5:3
The number you entered is 3!
Enter a number between 1 and 5:7
The number you entered is not between 1 and 5! game over!

八.continue

        continue 命令与 break 命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。 对上面的例子进行修改:

#!/bin/bash
while :
doecho -n "Enter a number between 1 and 5: "read aNumcase $aNum in1|2|3|4|5) echo "The number you entered is $aNum!";;*) echo "The number you entered is not between 1 and 5!"continueecho "game over";;esac
done

        运行代码发现,当输入大于 5 的数字时,该例中的循环不会结束,语句 echo "game over" 永远不会被执行。

九.esac

        case 的语法和 C family 语言差别很大,它需要一个 esac(就是 case 反过来)作为结束标记,每个 case 分支用右圆括号,用两个分号表示 break。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/55860.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML之表单设计

1、HTML表单 HTML表单是用于收集用户输入的信息&#xff0c;并将用户输入的内容信息传到后台服务器中。 表单是通过form标签实现。 特别注意&#xff1a;如果一些内容提交后&#xff0c;没有将内容提交给后台服务器&#xff0c;那么需要添加一个name属性&#xff0c;语法&am…

【27续】c++项目练习

定义一个或多个类&#xff0c;来描述以下需求&#xff1a; 汽车&#xff0c;有多个轮胎&#xff0c;一个发动机&#xff0c;品牌&#xff0c;型号, 价格&#xff0c; 行驶里程。 轮胎&#xff0c;有品牌&#xff0c;尺寸&#xff0c;气压。 发动机&#xff0c;有品牌&#x…

NC 单据模板自定义项 设置参照(自定义参照)

NC 单据模板自定义项 设置参照&#xff08;自定义参照&#xff09; 如图下图&#xff0c;NC 单据模板自定义项 设置参照&#xff1a; 1、选择需要设置参照的自定义字段&#xff0c;选择高级属性页签&#xff0c;在类型设置中&#xff0c;数据类型选择参照信息&#xff0c;即bd…

Debian12离线部署docker详细教程

1、转至 https://download.docker.com/linux/debian/dists/ 2、在列表中选择您的 Debian 版本。 cat /etc/os-release # 我的版本号是bookworm3、转到pool/stable/并选择适用的架构&#xff08;amd64、 armhf、arm64或s390x&#xff09; 4、在deb网址下&#xff0c;下载Doc…

【热门主题】000004 案例 Vue.js组件开发

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【热…

JavaWeb合集11-Maven高级

十一、Maven高级 1、分模块设计与开发 为什么?将项目按照功能拆分成若干个子模块,方便项目的管理维护、扩展,也方便模块间的相互调用&#xff0c;资源共享。 分模块开发需要先针对模块功能进行设计&#xff0c;再进行编码。不会先将工程开发完毕,然后进行拆分。 实现步骤&…

RabbitMQ下载与配置

安装Erlang Erlang 下载地址如下&#xff1a; https://erlang.org/download/otp_versions_tree.html 安装 RabbitMQ RabbitMQ 下载地址如下&#xff1a; https://www.rabbitmq.com/install-windows.html 查看服务&#xff0c;服务已经正常启动 打开Command Prompt 输入rabb…

Go语言中的错误处理:使用自定义错误类型和panic/recover机制

package mainimport ("fmt" )// 定义一个 DivideError 结构&#xff0c;用于表示除法错误 type DivideError struct {dividee int // 被除数divider int // 除数 }// 实现 error 接口 // 这个方法返回一个描述错误的字符串 func (de *DivideError) Error() string {s…

bash之基本运算符

一.算术运算符 vim test.sh #!/bin/basha10 b20valexpr $a $b echo "a b : $val"valexpr $a - $b echo "a - b : $val"valexpr $a \* $b echo "a * b : $val"valexpr $b / $a echo "b / a : $val"valexpr $b % $a echo "b % a …

TH-OCR:强大的光学字符识别工具与车牌识别应用

在当今数字化的时代&#xff0c;高效准确地识别文本和图像中的字符变得至关重要。TH-OCR&#xff08;清华 OCR&#xff09;作为一款优秀的光学字符识别软件&#xff0c;以其卓越的性能和广泛的应用场景&#xff0c;受到了众多用户的青睐。其中&#xff0c;车牌识别功能更是在交…

Discuz | 全站多国语言翻译和繁体本地转换插件 特色与介绍

Discuz全站多国语言翻译和繁体本地转换插件 特色与介绍 特殊&#xff1a;集成了2个开源库1.多国语言翻译 来自&#xff1a;github.com/xnx3/translate特色&#xff1a;无限使用接口 免费使用2个翻译端 带有一级和二级缓存 实现秒翻译 2.简体 繁体&#xff08;台湾&#xff09…

【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,1-11

文件下载与邀请翻译者 学习英特尔开发手册&#xff0c;最好手里这个手册文件。原版是PDF文件。点击下方链接了解下载方法。 讲解下载英特尔开发手册的文章 翻译英特尔开发手册&#xff0c;会是一件耗时费力的工作。如果有愿意和我一起来做这件事的&#xff0c;那么&#xff…

在MySQL中为啥引入批量键访问(Batch Key Access, BKA)

批量键访问&#xff08;Batch Key Access, BKA&#xff09; 是 MySQL 在某些情况下用于优化 JOIN 操作的一种技术&#xff0c;特别是在通过索引进行 JOIN 时&#xff0c;它能有效减少查询的随机 I/O。批量键访问优化通过将一批主键或索引键一次性发送给存储引擎来查找匹配的行&…

HTML和CSS:构建现代网页的基础

HTML和CSS:构建现代网页的基础 HTML(HyperText Markup Language)和CSS(Cascading Style Sheets)是构建和设计网页的两种核心技术。HTML负责网页的结构和内容,而CSS则负责网页的样式和布局。了解这两种技术对于网页设计和开发至关重要。 HTML基础 HTML是一种标记语言,…

springboot项目多个数据源配置 dblink

当项目中涉及到多个数据库连接的时候该如何处理&#xff1f; 在对应的配置文件&#xff0c;配置对应的数据库情况&#xff0c;不过我确实没咋测试对于事务的处理我可以后续在多做测试 配置文件中配置对应的数据源 然后再使用的时候使用这个 DS(“pd_ob”)注解。 然后又长知识…

Oracle数据库 expdp导出表报错ORA-01555处理

–expdp导出某一张表的时候总是出现如下报错 ORA-02354: error in exporting/importing data ORA-01555: snapshot too old: rollback segment number with name "" too small ORA-22924: snapshot too old–在导出过程中观察undo的使用情况&#xff0c;发现并未占…

《计算机视觉》—— 基于dlib库的人检检测

文章目录 一、dlib库的安装1. 通过PyCharm的Settings安装2. 通过Anaconda安装&#xff08;适用于Windows等操作系统&#xff09;3. 通过命令行安装4.懒人安装 二、基于dlib库的人检测1.对图像进行人脸检测2.打开电脑摄像头&#xff0c;检测人脸 一、dlib库的安装 在PyCharm中&…

Vulnhub:Me-and-My-Girlfriend-1

一.环境启动/信息收集 &#xff08;1&#xff09;根据物理地址用nmap的主机发现功能得出IP地址 nmap -P 192.168.138.0/24 //同网段下主机发现得到IP为192.168.138.180&#xff08;2&#xff09;做nmap的目录扫描和端口扫描来发现其他站带以及信息 nmap -p- 192.168.138.180 …

使用CSS Flexbox创建简洁时间轴

使用CSS Flexbox创建简洁时间轴 在网页设计中,时间轴是一种常见且有效的方式来展示事件的顺序和进程。本文将介绍如何使用CSS Flexbox创建一个简洁优雅的时间轴,无需复杂的JavaScript代码。 基本HTML结构 首先,我们需要创建基本的HTML结构: html复制<div class"ti…

Ansible自动化工具

一、Ansible概述 1.1 什么是Ansible Ansible 是一个开源的自动化工具&#xff0c;用于配置管理、应用程序部署和任务自动化。它让你可以通过编写简单的 YAML 文件&#xff08;剧本&#xff0c;Playbooks&#xff09;&#xff0c;轻松管理和配置多个服务器。Ansible 的特点是无…