1、多分支if条件语句格式

if [ 条件判断式1 ]
then
当条件判断式1成立时,执行程序1
elif [ 条件判断式2 ]
then
当条件判断式2成立时,执行程序2 …省略更多条件… else
当所有条件都不成立时,最后执行此程序
fi

2、练习

我们写一个例子,用if多分支条件语句来判断一下用户输入的是一个文件,还是一个目录。

# 需求:判断用户输入的是什么文件
[root@localhost tmp]# vim if-elif.sh # 编写Shell脚本
#!/bin/bash # 1.接收键盘的输入,并赋予变量file
read -t 30 -p "Please input a filename: " file # 2.判断文件类型
# 2.1判断file变量是否为空
if[ -z "$file" ]
then
# 如果为空,执行程序1,也就是输出报错信息
echo "Error,please input a filename!" # 退出程序,并返回值为1(把返回值赋予变量?)
exit 10001 # 2.2判断file的值是否存在
elif [ ! -e "$file" ]
then
# 如果不存在,则执行程序2
echo "Your input is not a file!" # 退出程序,把并定义返回值为2
exit 10002 # 2.3判断file的值是否为普通文件
elif [ -f "$file" ]
then
# 如果是普通文件,则执行程序3
echo"$file is a regulare file!" # 2.4判断file的值是否为目录文件
elif [ -d "$file" ]
then
# 如果是目录文件,则执行程序4
echo"$file is a directory!" # 2.5如果以上判断都不是,则执行程序5
else
echo "$file is an other file!" fi

3、说明

Shell程序是顺序执行的,以上面例子为例,如果当第一个条件判断你是否输入内容就识别内容为空了,就会输出错误信息。因为Shell程序是顺序执行,所以后边的程序还会继续执行。那第一个条件已经判断出错误了,那后边的匹配条件肯定也符合不了,再继续执行程序就是浪费资源了。

所以处理这类情况使用exit命令进行返回,用exit + 数字编码(自定义)的形式进行返回(推出脚本执行)。

什么意思?

我们之前说过一条命令正确执行,$?变量中保存的值是0

如果命令没有正确执行,$?变量中保存的值是非0

在Shell中使用exit + 数字编码的形式进行返回,这个数字编码就会赋值给$?变量。

最后执行完脚本来排错的时候,可以查看$?变量,根据$?变量的值,我们就可以很方便的找到Shell脚本中具体的内容,来排查程序出现的问题。

总结:

不符合规范的输入,也就是可能使程序报错的输入,可以用exit + 数字编码的形式进行返回,如上面练习中的2.1和2.2。

而符合规范的输入,直接匹配选项进行处理即可,不用写返回,如2.3和2.4。

4、综合练习

计算器脚本改进:

#!/bin/bash
# 字符界面加减乘除计算器。 # 1.通过read命令接收要计算的数值,并赋予变量num1和num2
read -t 30 -p "Please input num1: " num1
read -t 30 -p "Please input num2: " num2 # 2.通过read命令接收要计算的符号,并赋予变量ope.
read -t 30 -p "Please input a operator: " ope # 第一层判断
# 用来判断num1、num2和ope中都有值。
# -n选项:判断后边的字符串是否为空,非空为真。
# -a选项:逻辑与。
if [ -n "$num1" -a -n "$num2" -a -n "$ope" ]
then
# 判断输入的num1和num2内容是否是纯数字
# 判断一个变量的内容是否是纯数字有很多方法,下面一种是简单好理解的。
# 定义变量test1和test2的值为$(命令)的结果。
test1=$(echo $num1 | sed 's/[0-9]//g')
test2=$(echo $num2 | sed 's/[0-9]//g') # 说明:
# 就是通过sed命令,把变量test1值中的每一个字符,只要是0-9的内容,就替换为空。
# 最后如果test1的值最后为空,证明test1变量中的内容全部为数字,因为全部被替换了。
# 如果test1的值最后不为空,证明test1变量中的内容有非数字,即test1非纯数字。 # 第二层判断,用来判断num1和num2为数值。
# 如果变量test1和test2的值为空,则证明numl和num2是数字.
# -z选项:判断字符串是否为空(为空返回真)
# -a选项:逻辑与。
if [ -z "$test1" -a -z "$test2" ]
then
# 如果test1和test2是数字,则执行以下命令。 # 第三层判断用来确认运算符。
# 确认变量$ope中是什么运算符。
# 如果是加号则执行加法运算。
if [ "$ope" == '+' ]
then
value=$(($num1+$num2))
# 如果是减号,则执行减法运算。
elif [ "$ope" == '-' ]
then
value=$(($num1-$num2))
# 如果是乘号,则执行乘法运算。
elif [ "$ope" == '*' ]
then
value=$(($num1*$num2))
# 如果是除号,则执行除法运算。
elif [ "$ope" == '/' ]
then
value=$(($num1/$num2)) else
# 如果运算符不匹配,提示输入有效的符号
echo "Please enter a valid symbol."
# 并退出程序,返回错误代码10。
exit 10 fi else
# 如果test1和test2不为空,说明numl和num2不是数字。
# 则提示输入有效的数值。
echo "Please enter a valid value."
# 并退出程序,返回错误代码11。
exit 11
fi
else
echo "qing input neirong."
exit 12
fi # 输出数值运算的结果。
echo "$num1 $ope $num2:$value"

注意:

建议if条件语句嵌套最多不能超过三层。

如果写在一起if条件语句嵌套过多,则可以拆开写。

『忘了再学』Shell流程控制 — 34、if条件判断语句(二)的更多相关文章

  1. 『忘了再学』Shell流程控制 — 33、if条件判断语句(一)

    目录 1.单分支if条件语句 2.双分支if条件语句 (1)示例1 (2)示例2 什么是流程控制? 普通理解:Shell编写的程序是顺序执行的,也就是说第一命令先执行,然后接着执行第二条命令,然后再下 ...

  2. 『忘了再学』Shell流程控制 — 39、特殊流程控制语句

    目录 1.特殊流程控制语句介绍 2.exit语句 3.break语句 4.continue语句 1.特殊流程控制语句介绍 Shell程序或者说其他的程序,都是顺序执行的,也就是第一行执行完再执行第二行 ...

  3. 『忘了再学』Shell流程控制 — 38、while循环和until循环介绍

    目录 1.while循环 2.until循环 1.while循环 对while循环来讲,只要条件判断式成立,循环就会一直继续,直到条件判断式不成立,循环才会停止.和for循环的第二种格式for((初始 ...

  4. 『忘了再学』Shell流程控制 — 36、for循环介绍

    目录 1.for循环介绍 2.示例 语法一举例: 语法二举例: 3.for循环总结 4.练习:批量解压缩脚本 方式一:批量解压缩 方式二:批量解压缩 1.for循环介绍 for循环是固定循环,也就是在 ...

  5. 『忘了再学』Shell流程控制 — 35、多分支case条件语句

    目录 1.case条件语句介绍 2.case语句需要注意的内容 3.练习 示例1 示例2 1.case条件语句介绍 case语句和if-elif-else语句一样都是多分支条件语句,不过和if多分支条 ...

  6. 『忘了再学』Shell基础 — 32、Shell中test测试命令详解

    目录 1.test测试命令 (1)test命令介绍 (2)test命令使用方式 (3)示例 2.按照文件类型进行判断 3.按照文件权限进行判断 4.两个文件之间进行比较 5.两个整数之间比较 6.字符 ...

  7. 『忘了再学』Shell基础 — 1、Shell的介绍

    目录 1.Shell的由来 2.Shell的两种执行指令方式 3.什么是Shell脚本 4.Shell 是一种脚本语言 1.Shell的由来 我们比较熟悉Windows系统的图形化界面,对于图形界面来 ...

  8. 『忘了再学』Shell基础 — 10、Bash中的特殊符号(二)

    提示:本篇文章接上一篇文章,主要说说()小括号和{}大括号的区别与使用. 8.()小括号 ():用于一串命令执行时,()中的命令会在子Shell中运行.(和下面大括号一起说明) 9.{}大括号 {}: ...

  9. 『忘了再学』Shell基础 — 16、位置参数变量

    目录 1.位置参数变量$n 2.位置参数变量$*和$@ 3.位置参数变量$# 位置參数变量的作用主要用于脚本的传参. 位置參数变量的名称和作用都是确定不能改变的,但是该变量的内容是可以更改的,也就是变 ...

随机推荐

  1. Linux 开启远程访问

    系统:Ubuntu16.0 虚拟机 问题:Windows访问Ubun被拒绝 解决方法: 1.先检测是否安装SSH服务 1 sudo apt-get install ssh 2.编辑ssh配置文件 1 ...

  2. 图片杂乱无章、分享麻烦?HMS Core图片分类服务教你快速筛选、分类、整合相册

    如今手机摄影越来越方便,随手一拍就能记录美好生活.但照片越多,整理越麻烦,有的时候我们想对照片进行二次加工.分享,需要不停翻找相册.HMS Core机器学习服务(ML Kit)提供了图片分类服务,方便 ...

  3. javaWeb代码整理03-druid数据库连接池

    jar包: maven坐标: <dependency> <groupId>com.alibaba</groupId> <artifactId>druid ...

  4. android软件简约记账app开发day02-收入支出明细页面绘制

    android软件简约记账app开发day02-收入支出明细页面绘制 效果图 列表界面绘制 新建layout文件-item_mainlv.xml大体使用绝对布局,嵌套相对布局,嵌套文本内容实现 < ...

  5. 一种O(n)时间复杂度的计数排序算法和Top N热词算法

    排序算法是研究非常广泛且超级经典的算法,主流排序算法的时间复杂度基本都在O(nlogn). 今天就介绍一种以hash表为基础的,时间复杂度能够达到O(n)的排序算法--计数排序: 同时基于它的思想,完 ...

  6. openstack PCI透传(GPU)

    描述 kolla-ansible部署openstack的GPU透传方法 一.gpu物理服务器配置 在gpu服务器上主启用IOMMU 确认内核⽀支持iommu $ cat /proc/cmdline | ...

  7. Spring 源码(7)Spring的注解是如何解析的?

    上一篇 https://www.cnblogs.com/redwinter/p/16196359.html 介绍了BeanFactoryPostProcessor的执行过程,这篇文章介绍Spring中 ...

  8. 借助ADB冻结与卸载Android系统应用(免ROOT)

    背景: 我妈的手机饱受系统应用广告推送之苦,每天都能在通知栏里收到好几条广告.为了给她个清净,本篇博文应运而生. 目标: 卸载安卓系统应用 所用工具: 硬件:我妈的手机(魅蓝5) PC端:Minima ...

  9. ONNXRuntime学习笔记(四)

    接上一篇在Python端的onnx模型验证结果,上一篇在Pytorch和onnxruntime-gpu推理库上分别进行效果效率统计分析,结论要比最初设置的50ms高很多,这一篇我将在C++端写个测试代 ...

  10. 在vue-cli中安装scss,且可以全局引入scss的步骤

    简历魔板__个人简历模板在线生成 在写vue的css样式时,觉得需要css预处理器让自己的css更加简洁.适应性更强.可读性更佳,更易于代码的维护,于是在vue-cli脚手架采用scss.写过的人都知 ...