shell 编程之流程控制语句详解
前言
可以说,在任何一门编程语言中都离不开流程控制语句,使用流程控制语句可以帮助程序处理各类复杂的操作,常用的流程控制语句,比如: if-else,while,for循环等,在linux 的shell 编程语法中,也提供了丰富的流程控制语句,接下来将一一做详细的说明。
一、if - else 语句
if 语法
if 条件
then命令
fi
if - else 语法
if 条件
then命令
else命令
fi
if elif else 语法
if 条件1
then命令1
elif 条件2
then命令2
elif 条件3
then命令3
……
else命令N
fi
接下来用一个简单的案例完整演示下这几种if 语法的使用
案例需求描述
提示"请输入考试成绩:" 接收用户输入的一个成绩, 之后使用if else条件句判断
要求1: 小于 60 输出"不及格"
要求2: 大于等于70 并且 小于80 输出"中等"
要求3: 大于等于80 并且 小于90 输出"良好"
要求4: 大于等于90 并且 小于等于100 输出"优秀"
要求5: 以上不符合输出"成绩不合法"
shell 脚本内容
#!/bin/bash
read -p "请输入考试成绩:" score
if (( $score < 60 )); thenecho "不及格"
elif (( $score >= 60 && $score < 70 )); thenecho "及格"
elif (( $score >= 70 && $score < 80 )); thenecho "中等"
elif (( $score >= 80 && $score < 90 )); thenecho "良好"
elif (( $score >= 90 && $score <= 100 )); thenecho "优秀"
elseecho "成绩不合法"
fi
执行上面的shell ,观察输出效果
补充说明
(())
是一种数学计算命令,它除了可以进行最基本的加减乘除运算,还可以进行大于、小于、等于等关系运算,以及与、或、非逻辑运算。当 a 和 b 相等时,(( $a == $b ))
判断条件成立,进入 if,执行 then 后边的 echo 语句
二、case语句
shell 中case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令,当分支较多,并且判断条件比较简单时,使用 case in 语句就比较方便了。
case 语法结构
case 值 in
匹配模式1)命令1命令2...;;
匹配模式2)命令1命令2...;;
*)命令1命令2...;;
esac
关于case 语法的几点补充说明
- 每一匹配模式必须以右括号结束;
- 取值可以为变量或常数;
- 匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;(类似break, 不可以替代否则语法报错);
- 取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令;
- case、in 和 esac 都是 Shell 关键字, esac就是case的反写在这里代表结束case;
- 匹配模式: 可以是一个数字、一个字符串,甚至是一个简单正则表达式;
简单正则表达式支持如下通配符
格式 | 说明 |
---|---|
* | 表示任意字符串。 |
[abc] | 表示 a、b、c 三个字符中的任意一个。比如,[15ZH] 表示 1、5、Z、H 四个字符中的任意一个。 |
[m-n] | 表示从 m 到 n 的任意一个字符。比如,[0-9] 表示任意一个数字,[0-9a-zA-Z] 表示字母或数字。 |
| | 表示多重选择,类似逻辑运算中的或运算。比如,abc | xyz 表示匹配字符串 "abc" 或者 "xyz"。 |
case 语句案例演示
#!/bin/bash
read -p "请输入一个0~7的数字:" number
case $number in
1)echo "星期一";;
2)echo "星期二";;
3)echo "星期三";;
4)echo "星期四";;
5)echo "星期五";;
6)echo "星期六";;
0|7)echo "星期日";;
*)echo "您输入的数字无效";;
esac
执行上面的shell脚本,观察输出效果
三、while 语句
while 语法
while 条件
do命令1命令2...continue; # 结束当前这一次循环, 进入下一次循环break; # 结束当前循环
done
一个简单的案例
#!/bin/bash
read -p "请输入一个数字:" number
i=0
while [[ $i < $number ]]
doecho "hello world :" $i((i++))
done
执行上面的shell 脚本,观察输出效果
使用while语句可以实现无限循环,写法如下
while :
docommand
done
或者下面这样
while true
docommand
done
四、until语句
until 也属于循环结构语句, until 循环与 while 循环在处理方式上刚好相反, 循环条件为false会一致循环, 条件为true停止循环。
until 语法
条件如果返回值为1(代表false),则继续执行循环体内的语句,否则跳出循环。
until 条件
do命令
done
案例演示
#!/bin/bash
read -p "请输入一个数字:" number
i=0
until [[ ! $i < $number ]]
doecho "hello world : " $i((i++))
done
执行上面的shell脚本,观察输出效果
五、for语句
for 语法写法一
for var in item1 item2 ... itemN
do命令1命令2...
done
1、var是循环变量
2、item1 item2 ... itemN 是循环的范围
演示案例
#!/bin/bash
for i in 1 2 3 4 5
doecho "hello world :" $i
done
执行上面的脚本,观察输出效果
for 语法写法二
语法结构
for var in {start..end}
do命令
done
start: 循环范围的起始值,必须为整数
end: 循环范围的结束值, 必须为整数
案例演示
#! /bin/bash
for i in {1..5}; do echo $i; done
运行这段脚本,观察输出效果
for 语法写法三
语法结构
这种写法相信做过应用端编程开发的同学更熟悉点吧
for((i=start;i<=end;i++))
do命令
done
也可以简写成一行
for((i=start;i<=end;i++)); do 命令; done
案例演示
#! /bin/bash
for((i=0;i<=3;i++)); do echo "hello word : " $i; done
运行上面的sql,观察执行效果
无限for循环
在某些特殊的场景下,需要程序无限循环下去,可以参考下面的写法
for((;;)); do 命令; done
六、select 语句
select in 循环用来增强交互性,它可以显示出带编号的菜单,用户输入不同的编号就可以选择不同的菜单,并执行不同的功。select in 是 Shell 独有的一种循环,非常适合终端(Terminal)这样的交互场景, 其他语言没有。
select 语法
select var in menu1 menu2 ...
do命令
done
注意:
1、select 是无限循环(死循环),输入空值,或者输入的值无效,都不会结束循环,只有遇到 break 语句,或者按下 Ctrl+D 组合键才能结束循环;
2、执行命令过程中: 终端会输出
#?
代表可以输入选择的菜单编号;
案例演示1
#!/bin/bash
echo "你的爱好是什么?"
select hobby in "编程" "游戏" "篮球" "游泳"
doecho $hobbybreak
done
echo "你的爱好是:${hobby}"
运行上面的shell观察执行效果
案例演示2
#!/bin/bash
echo "你的爱好是什么"
select hobby in "编程" "游戏" "篮球" "游泳"
docase $hobby in"编程")echo "编程,多敲代码"break;;"游戏")echo "少玩游戏"break;;"篮球"|"游泳")echo "运动有利健康"break;;*)echo "输入错误,请重新输入"esac
done
运行上面的shell,观察执行效果
接下来,补充几个比较重要的关于shell操作中的知识点
八、文件测试 test
在使用shell编程过程中,经常涉及到对各类文件,文件目录的操作,比如判断文件目录是否存在,文件里面的内容是否存在等,就需要用到文件测试相关的命令,下面总结的是和文件测试操作相关的语法。
参数 | 说明 |
---|---|
==-e 文件名== | exists, 如果文件存在则为真 |
==-r 文件名== | read,如果文件存在且可读则为真 |
==-w 文件名== | write,如果文件存在且可写则为真 |
==-x 文件名== | execute,如果文件存在且可执行则为真 |
==-s 文件名== | string,如果文件存在且至少有一个字符则为真 |
==-d 文件名== | directory,如果文件存在且为目录则为真 |
-f 文件名 | file,如果文件存在且为普通文件则为真 |
-c 文件名 | character,如果文件存在且为字符型特殊文件则为真 |
-b 文件名 | 如果文件存在且为块特殊文件则为真 |
案例演示
#!/bin/bashif test -w ./if.sh
thenecho '文件已存在并且可写!'
elseecho '文件不存在或不可写!'
fiif test -e ./if.sh -a -e ./control2.sh
thenecho '两个文件都存在!'
elseecho '可能有一个或两个文件不存在'
fi
运行上面的shell脚本,观察输出效果
补充说明
Shell提供了与( -a )、或( -o )、非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为:"!"最高,"-a"次之,"-o"最低, 语法,如下:
test 条件1 -o 条件2 -a 条件3 ...
九、整数和字符串比较 test
Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。
功能与[]一样。
整数比较测试
if test 数字1 options 数字2
then
...
fi
options具体如下
参数 | 说明 |
---|---|
-eq | 等于则为真 |
-ne | 不等于则为真 |
-gt | 大于则为真 |
-ge | 大于等于则为真 |
-lt | 小于则为真 |
-le | 小于等于则为真 |
整数比较具体案例
#!/bin/bash
num1=1 num2=1 num3=2
echo "num1=${num1},num2=${num2},num3=${num3}"if test $num1 -eq $num2
thenecho 'num1和num2两个数相等!'
elseecho 'num1和num2两个数不相等!'
fiif test $num2 -eq $num3
thenecho 'num2和num3两个数相等!'
elseecho 'num2和num3两个数不相等!'
fi
运行上面的shell,观察执行效果
字符串比较测试
语法结构
参数 | 说明 |
---|---|
= 或 == | 等于, 等于返回0代表成功,否则返回1代表失败 |
!= | 不等于 |
\<
|
小于 |
\>
|
大于 |
-z 字符串 | 字符串的长度为零则为真 |
-n 字符串 | 字符串的长度不为零则为真 |
字符串比较具体案例
#!/bin/bashstr1="itheima" str2="itcast" str3=""
echo "str1=${str1},str2=${str2},str3=${str3}"if test $str1 = $str2
thenecho 'str1和str2两个字符串相等'
elseecho 'str1和str2两个字符串不相等'
fiif test $str1 \> $str2
thenecho 'str1大于str2'
elseecho 'str1小于str2'
fiif test -z $str2
thenecho "str2字符串长度为0"
elseecho "str2字符串长度不为0"
fiif test -z $str3
thenecho "str3字符串长度为0"
elseecho "str3字符串长度不为0"
fi
执行上面的shell,观察输出效果
shell 编程之流程控制语句详解相关推荐
- python流程控制语句-python学习 流程控制语句详解
###################### 分支语句 python3.5 ################ #代码的缩进格式很重要 建议4个空格来控制 #根据逻辑值(True,Flase)判断程序的 ...
- shell 编程 入门到实战详解
一. shell变量.循环 概述 Shell是一种具备特殊功能的程序,它提供了用户与内核进行交互操作的一种接口.它接收用户输入的命令,并把它送入内核去执行.内核是Linux系统的心脏,从开机自检就驻留 ...
- shell编程—tomcat自动发包详解
tomcat是我们日常使用的java容器,常作为web服务器和Nginx配合使用,运维工程师需要经常发布更新包,而使用shell脚本可以实现高效安全的发包,这以我虚拟机环境来编写. 一. 需求 上传w ...
- 11、流程控制语句详解,IF,CASE,LOOP,LEAVE, ITERATE,REPEAT,WHILE
在存储过程和自定义函数中可以使用流程控制语句来控制程序的流程.MySQL 中流程控制语句有:IF 语句.CASE 语句.LOOP 语句.LEAVE 语句.ITERATE 语句.REPEAT 语句和 W ...
- linux shell编程与编辑器使用详解_使用 Mu 编辑器教授 Python | Linux 中国
导读:Mu 让你轻松学会如何编写 Python 代码. 本文字数:2147,阅读时长大约: 3分钟https://linux.cn/article-12654-1.html 作者:Don Watkin ...
- python流程控制语句-Python流程控制语句详解
1.程序结构 计算机在解决问题时,分别是顺序执行所有语句.选择执行部分语句.循环执行部分语句,分别是:顺序结构.选择结构.循环结构.如下图: 2.选择语句 2.1最简单的if语句 Python使用保留 ...
- Python基础教程,流程控制语句详解
1.程序结构 计算机在解决问题时,分别是顺序执行所有语句.选择执行部分语句.循环执行部分语句,分别是:顺序结构.选择结构.循环结构.如下图: 很多人学习python,不知道从何学起. 很多人学习pyt ...
- SHELL编程传递参数方法详解$# $* $0 $1 $2 $...
目录 实例 特殊字符用来处理参数: $* 与 $@ 区别: 我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为: $n.n 代表一个数字,1 为执行脚本的第一个参数,2 为执行 ...
- linux Shell(脚本)编程入门实例讲解详解
linux Shell(脚本)编程入门实例讲解详解 为什么要进行shell编程 在Linux系统中,虽然有各种各样的图形化接口工具,但是sell仍然是一个非常灵活的工具.Shell不仅仅是命令的收集, ...
最新文章
- CSS3 Box-shadow 阴影效果用法
- 开发75条(写的不错) 选择自 churujianghu 的 Blog
- Linux终端操作MySQL常用命令
- 【Java】对Web Service的理解
- linux ssh密钥对,Mac使用ssh密钥登录Linux
- jupyter可以打开HTML文件吗,Jupyter ~ 像写文章般的 Coding (附:同一个ipynb文件,执行多语言代码)...
- Sigma Grid 2.4 探究 1
- 主打轻薄长续航搭载骁龙730 联想Z6发布 1899元起!
- android实现字体滚动,Android实现字幕滚动的方法
- mnist数据集_探索Tensorflow2中神经网络算法——基于Mnist数据集(一)
- Java EE互联网轻量级框架整合开发
- 在校大学生如何用编程赚钱?| 我的大学赚钱之路
- 罗技鼠标可以用c语言吗,罗技无线鼠标连接实用程序软件 v1.00.23 官方最新版
- 聊一聊物联网嵌入式芯片的内容结构
- 纸张的规格:A3.A4.A5.A6纸的尺寸大小
- 公司新产品之我见(1)——智能家居中的无线充电/供电设备
- 基于PHP+MySQL的企业人事员工管理系统
- 错误 1 error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 C:\Users\Administ
- 30个绝对让你惊叹的幽默创意广告设计
- javaScript中正则表达式的使用
热门文章
- 奶茶销售界面 仅供大家参考 哈哈哈
- javascript 内置对象Math总结及其案例
- CountDownLatch测试await
- 电脑端吃鸡 为啥显示服务器上线,网易吃鸡手游《终结者2》PC互通版正式上线:轻松电脑开黑...
- ApplicationEvent与ApplicationListener
- python使用循环嵌套金字塔_流程控制主while,for,python画金字塔,画9*9乘法表
- SuperMap GIS 10i倾斜摄影白皮书
- 当前AI的特点及带来的工业革命
- Python打包发布
- python打包成可执行文件