Shell编程条件语句(if、case)

news2024/10/7 9:17:06

目录

一、Shell条件语句

1.条件表达式测试

2.文件测试

3.整数值比较

4.字符串比较

5.逻辑测试

二、if 条件语句(串行执行)

(1)单分支结构

(2)双分支结构

(3)多分支结构

三、case语句(并行执行)


一、Shell条件语句

Shell环境根据命令执行后的返回状态值($?)来判断是否执行成功,当返回值为0(真 true)时表示成功,返回值为非0值(假 false)时表示失败或异常。

(与java等编程语言判断返回值完全相反!)

test 命令

更多操作可使用 man test 查看

1.条件表达式测试

[ 条件表达式 ]

[root@localhost1 ~]#[ 1 = 1 ]
[root@localhost1 ~]#echo $?
0
​
[root@localhost1 ~]#[ 1 > 10 ]
[root@localhost1 ~]#echo $?
1

2.文件测试

[ 操作符 文件或目录 ]

文件操作符含义
-e查看文件或目录是否存在(exist)
-d查看文件是否是一个目录(directory)
-f查看文件是否是一个目录(file)
-r查看文件或目录是否可读(read)
-w查看文件或目录是否可写(write)
-x查看文件或目录是否可执行(excute)
-L查看文件或目录是否是软链接文件(link)
//测试 /root 是否是一个目录
[root@localhost1 ~]#test -d /root/
[root@localhost1 ~]#echo $?
0  --是
​
//测试 /root 是否是一个文件
[root@localhost1 ~]#[ -f /root/ ]
[root@localhost1 ~]#echo $?
1  --否

 

 

 

3.整数值比较

[ 整数或变量 操作符 整数或变量 ]

数值操作符含义
-eq等于(equal)
-ne不等于(not equal)
-lt小于(less then)
-gt大于(greater then)
-le小于等于(less and equal)
-ge大于等于(greater and equal)
​
[root@localhost1 ~]#a=10
[root@localhost1 ~]#b=20
​
//测试 $a 是否等于10
[root@localhost1 ~]#test $a -eq 10
[root@localhost1 ~]#echo $?
0
//测试 $a 是否大于 $b
[root@localhost1 ~]#test $a -gt $b
[root@localhost1 ~]#echo $?
1


​

4.字符串比较

[字符串1 操作符 字符串2]

字符串比较操作符含义
=等于
!=不等于
-z判断字符串是否为空
​
as[root@localhost1 ~]#echo $LANG
zh_CN.UTF-8
​
//判断 $LANG 是否为 us.en
[root@localhost1 ~]#[ $LANG = "us.en" ]
[root@localhost1 ~]#echo $?
1


​

5.逻辑测试

[ 表达式1 ] 操作符 [ 表达式2 ]

逻辑操作符含义
&&且(逻辑与),两边表达式均为真才返回0,否则返回非0
-a含义同上,使用方法为[ 表达式1 -a 表达式2 ]
||或(逻辑或),两边表达式其一为真返回0,全否才返回非0
-o含义同上,使用方法为[ 表达式1 -o 表达式2 ]
取反(逻辑否),真否结果返回值相反
​
[root@localhost1 ~]#a=1
[root@localhost1 ~]#b=1
​
//逻辑与,两条命令均执行成功才返回0
[root@localhost1 ~]#[ $a = 1 ] || [ $a = $b ]
[root@localhost1 ~]#echo $?
0
​
//逻辑或,其一为真则返回0
[root@localhost1 ~]#[ $a > 1 ] || [ $a = $b ]
[root@localhost1 ~]#echo $?
0


​

特殊用法:&& 与 || 一起使用(逻辑与执行返回状态为否,则继续执行逻辑或后的命令)

//创建文件1.txt
[root@localhost1 data]#touch 1.txt
[root@localhost1 data]#ls
1.txt
​
//判断1.txt 是否是目录,逻辑与返回状态为否,继续执行逻辑或后的命令
[root@localhost1 data]#[ -d 1.txt ] && echo "1.txt 是目录" || echo "1.txt 不是目录"
1.txt 不是目录

二、if 条件语句(串行执行)

(1)单分支结构

if [ 条件表达式 ];than

执行命令行 (当条件判断成立)

fi

img

//判断3是否大于2
[root@localhost1 ~]#vim test1.sh
#!/bin/bash
if [ 3 -ge 2 ]; then
  echo "yes"
fi
​
[root@localhost1 ~]#bash test1.sh
yes

(2)双分支结构

if [ 条件表达式 ];than

执行命令行 (当条件判断成立)

else

执行命令行 (当条件判断不成立)

fi

img

//判断年龄满足大于等于18的购买成人票,不满足购买学生票
[root@localhost1 ~]#vim test2.sh
#!/bin/bash
read -p "请输入您的年龄:" age
if [ $age -ge 18 ];then
  echo "请购买成人票(80元)"
else
  echo "请购买学生票(40元)"
fi
​
[root@localhost1 ~]#bash test2.sh
请输入您的年龄:20
请购买成人票(80元)
​
[root@localhost1 ~]#bash test2.sh
请输入您的年龄:8
请购买学生票(40元)

(3)多分支结构

if [ 条件表达式1 ];than

执行命令行 (当条件判断1成立)

elif [ 条件表达式2 ];than -- 可以有多个elif 判断语句

执行命令行 (当条件判断2成立)

else

执行命令行 (当条件判断都不成立)

fi

img

​
[root@localhost1 ~]#vim test2.sh
#!/bin/bash
read -p "请输入您的年龄:" age
if [ $age -ge 60 ];then
  echo "请购买老人票(20元)"
elif [ $age -gt 18 ] && [ $age -lt 60 ];then
  echo "请购买成人票(80元)"
elif [ $age -ge 6 ] && [ $age -lt 18 ];then
  echo "请购买学生票(40元)"
else
  echo "请购买儿童票(20元)"
fi
​
[root@localhost1 ~]#bash test2.sh
请输入您的年龄:70
请购买老人票(20元)
​
[root@localhost1 ~]#bash test2.sh
请输入您的年龄:23
请购买成人票(80元)
​
[root@localhost1 ~]#bash test2.sh
请输入您的年龄:14
请购买学生票(40元)
​
[root@localhost1 ~]#bash test2.sh
请输入您的年龄:3
请购买儿童票(20元)


​

三、case语句(并行执行)

case 变量名 in

模式1) -- 指定模式可以有多个(支持通配符)

命令序列

;;

模式2)

命令序列

;;

*) -- 默认模式(除上述指定模式的其他情况)

默认命令序列

;;

esac

img

[root@localhost1 ~]#vim test3.sh
#!/bin/bash
read -p "请输入你的分数(0~100):" num
​
case $num in
100)
  echo "满分!"
  ;;
​
9[0-9])
  echo "优秀!"
  ;;
​
[78][0-9])
  echo "良好!"
  ;;
​
6[0-9])
  echo "合格!"
  ;;
​
[0-9]|[1-5][0-9])
  echo "不及格!"
  ;;
​
*)
  echo "输入有误,请输入 0~100 的范围!"
esac
​
[root@localhost1 ~]#bash test3.sh
请输入你的分数(0~100):100
满分!
​
[root@localhost1 ~]#bash test3.sh
请输入你的分数(0~100):97
优秀!
​
[root@localhost1 ~]#bash test3.sh
请输入你的分数(0~100):78
良好!
​
[root@localhost1 ~]#bash test3.sh
请输入你的分数(0~100):62
合格!
​
[root@localhost1 ~]#bash test3.sh
请输入你的分数(0~100):45
不及格!
​
[root@localhost1 ~]#bash test3.sh
请输入你的分数(0~100):123
输入有误,请输入 0~100 的范围!

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

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

相关文章

C语言之数据在内存中的存储习题讲解

上个博客我们讲到了整型家族,对于整型家族来说有有符号和无符号之分 short signed short unsigned short int signed int unsigned int char在VS环境上其实是signed char unsigned char 对于有符号的char来说,把二进制位序列中的最高位当成符号位 对于无符号的char来…

【计算机组成原理与体系结构】控制器

目录 一、CPU的功能与基本结构 二、指令周期的数据流 三、数据通路 四、硬布线控制器 五、微程序控制器 六、微指令 一、CPU的功能与基本结构 运算器基本结构 控制器基本结构 CPU的基本结构 二、指令周期的数据流 取址周期 间址周期 中断周期 指令周期流程 三、数据通路 …

微信云开发

微信云数据库 快速开始:小程序/小游戏 | 微信开放文档 (qq.com) 首先微信云开发需要一个真实小程序的 AppID,而不能使用测试号。 然后点击这个开通云开发 云的环境大概是这样的 首先我们要初始化 否则会像这样,报错 写在app.js的 onLaunc…

LearnOpenGL-高级OpenGL-11.抗锯齿

本人初学者,文中定有代码、术语等错误,欢迎指正 文章目录 抗锯齿多重采样锯齿产生原因多重采样方式 OpenGL的MSAA例子:提示GLFW离屏MSAA例子1:多重采样帧缓冲传送到屏幕上例子2:采样多重采样帧缓冲的纹理缓冲与后期效果…

【华为OD统一考试B卷 | 100分】太阳能板最大面积(C++ Java JavaScript Python)

题目描述 给航天器一侧加装长方形或正方形的太阳能板(图中的红色斜线区域),需要先安装两个支柱(图中的黑色竖条),再在支柱的中间部分固定太阳能板。 但航天器不同位置的支柱长度不同,太阳能板的安装面积受限于最短一侧的那根支柱长度。如图: 现提供一组整形数组的支柱高…

chatgpt赋能python:如何升级你的Python到最新版本

如何升级你的Python到最新版本 Python作为一种强大的编程语言,拥有广泛的用途,从网站开发到数据科学,都可以使用它来实现。然而,Python不断更新,每个新版本都带来了新的功能和改进,因此升级Python到最新版…

二叉树概念(二)

平衡二叉树 AVL树(Adelson-Velsky 和 Landis) 左子树和右子树的高度之差的绝对值小于等于1 C++ 中,可以直接使用 std::set 类作为平衡二叉树;Java 中,可以直接使用 TreeSet。在 Python 中,没有内置的库可以用来模拟平衡二叉树。 力扣 红黑树 (Red-Black Tree) 是一种二…

Shell脚本数组简介及运用

目录 一、数组简介 二、数组支持的数据类型 三、定义数组 四、获取数组某个索引处的值 五、遍历数组元素 六、获取数组长度 七、截取数组元素 八、数组的元素替换 1.临时替换 2.永久替换 九、删除元素或数组 十、数组追加元素 1.满元素数组追加 2.非满元素数组追…

【模块三:职业成长】39|能力维度四:如何从做技术到为企业创造生存优势?

你好,我是郭东白。今天这节课是架构师能力维度的第四部分,我们来继续探索架构师成长过程的能力跃迁。不过今天我们会连续讲两个跃迁:从跨域架构师到总架构师(首席架构师)的跃迁;从总架构师再到 CTO 的跃迁。…

浅尝 xen 虚拟化

前言 之前分享过使用 oVirt 部署私有虚拟化环境, oVirt 是基于 KVM 虚拟化开发了一系列的管理工具, 以 Web Console /CLI 的方式交付使用. 今天记录和分享的是在 VMware Workstation 中使用 Alpine 作为基础操作系统部署 xen 虚拟化环境的简单测试. xen 基本概念 xen 可以理…

chatgpt赋能python:Python的发音

Python的发音 Python是一种广泛使用的编程语言,用于web开发、数据分析、科学计算等众多领域。然而,Python这个词汇的发音在不同的地方却存在差异。在本文中,我们将介绍Python的发音,解决大家的困惑。 发音方式 Python在英语中常…

【数学建模系列】TOPSIS法的算法步骤及实战应用——MATLAB实现

文章目录 TOPSIS简介方法和原理数学定义数学语言描述现实案例 正负理想解定义实例 量纲 TOPSIS法的算法步骤1.用向量规范化的方法求得规范决策矩阵2.构成加权规范阵C(c~ij~)~m*n~3.确定正负理想解的距离4.计算各方案到正理想解与负理想解的距离5.计算各方案的综合评价指数6.排列…

STM32源码阅读记录之HAL库(SystemTick)

问题 HAL_Delay是怎么做到可以延迟控制的? 分析记录 步骤01:看函数本身 void HAL_Delay(uint32_t Delay); /*** brief 此函数根据变量递增提供最小延迟(以毫秒为单位)。* note 在默认的实现中,SysTick计时器是时基的来源。它用…

【Leetcode -225.用队列实现栈 -232.用栈实现队列】

Leetcode Leetcode -225.用队列实现栈Leetcode -232.用栈实现队列 Leetcode -225.用队列实现栈 题目:仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。 …

chatgpt赋能python:Python实践:如何升级pip

Python实践:如何升级pip Python作为一门高效的脚本语言,被广泛应用于数据分析、人工智能、Web开发等领域。而pip则是Python的包管理工具,是开发Python应用的必备工具。但是pip在使用过程中,有时候会出现版本不兼容或者出现漏洞等…

chatgpt赋能python:Python取两位小数的方法

Python取两位小数的方法 介绍 Python是一种高级编程语言,因其简洁易懂、跨平台等特点,被广泛应用于科学计算、数据分析、网站开发、人工智能等领域。在编写Python程序时,我们经常需要将浮点数精确到小数点后几位,比如精确到两位…

【0基础教程】Javascript 里的分组正则Capturing Groups使用方法及原理

一、从最简单开始 现有一个字符串: “1-apple” 需要提取出 1 和 apple 来,对应的正则表达式很简单: ^(\d)-(.)$ 对应的代码也比较简单: const str "1-apple"const regexp /^(\d)-(.)$/let match regexp.exec(str)c…

chatgpt赋能python:Python如何升序输出?从入门到实践!

Python如何升序输出?从入门到实践! 作为一门高级编程语言,Python是目前应用广泛且最为流行的一门语言之一。它逐渐成为开发者的首选语言,因为它易学易用,可读性强,支持多种编程范式,提供了强大…

chatgpt赋能python:如何升级Python的pip版本

如何升级Python的pip版本 如果你使用Python来进行程序开发,那么你一定需要用到pip,它是Python的包管理器,用于安装和管理各种Python库。 不过,一旦你开始使用pip,你可能会遇到一个问题:你的pip版本可能会…

软考A计划-系统架构师-学习笔记-第二弹

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 👉关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…