【Shell 脚本速成】07、Shell 流程控制——if 判断语句

news2024/11/19 9:24:47

目录

一、if 介绍

二、单 if 语法

三、if…else 语句

四、if…elif…else

五、if 嵌套 if

5.1 使用 if 嵌套 if 的方式判断两个整数的关系

5.2 写一个nginx安装初始化脚本 

六、if 语句与 shell 运算 

6.1 与文件存在与否的判断

6.2 文件权限相关的判断

6.3 整数之间的判断

6.4 字符串之间的判断

6.5 多重条件判断

七、if 高级用法 

7.1 条件符号使用双圆括号,可以在条件中植入数学表达式 if (())

7.2 使用双方括号,可以在条件中使用通配符

八、简写 if 


 

一、if 介绍

如何写一个高可用性的脚本,赋予脚本智能化,赋予脚本执行逻辑。

比如nginx安装脚本中

  • configure执行成功在执行make,
  • make执行成功在执行make install
  • 上一步错误就不需要执行后面的代码了。

answer: 加入判断

只要你想在代码中判断一下的时候就第一时间想到if就行了,适用于99%的语言。

        当我们在写程序的时候,时常对上一步执行是否成功如何判断苦恼,当我们今天学习了if就可以解决你的苦恼。if语句在我们程序中就是用来做判断的,以后大家不管学习什么语言,以后只要涉及到判断的部分,大家就可以直接拿if来使用,不同的语言之间的if只是语法不同,原理是相同的。

二、单 if 语法

适用范围:只需要一步判断,条件返回真则执行下一步操作。

语句格式

if [ condition ]           # condition 值为true or false。[] 两边需要空格
   then                    # 条件为真的时候执行
      commands             # 代码块。一行或者多行代码
fi			               # 语句的结束

        下面通过一段代码来演示一下吧,判断 当前用户是不是root,如果不是那么返回"ERROR: need to be root so that!"

[root@shell ~]# vim /tmp/if-1.sh
#!/bin/bash

if [ $USER != 'root' ]
   then
	echo "ERROR: need to be root so that!"
	exit 1
fi

[root@shell ~]# chmod 755 /tmp/if-1.sh
[root@shell ~]# sh /tmp/if-1.sh ; echo $?
0
[root@shell ~]# echo $USER
root

# 切换用户
[root@shell ~]# su - harry 
上一次登录:二 11月 29 18:22:56 CST 2022pts/0 上
[harry@shell ~]$ sh /tmp/if-1.sh 
ERROR: need to be root so that!
[harry@shell ~]$ echo $?
1
[harry@shell ~]$ exit
登出

三、if…else 语句

适用范围:两步判断,条件为真执行操作,条件为假则执行另一个操作。

if [ condition ]        # 条件判断 
     then           	# 条件为真
          commands1     	# 真  要执行代码块
else                	# 条件为假
          commands2     	# 假   要执行的代码块
fi         		        # 结束

        通过一段代码演示一下吧,判断当前登录用户是管理员还是普通用户,如果是管理员输出“hey admin”; 如果是普通用户输出“hey guest”:

[root@shell tmp]# vim if-2.sh
#!/bin/bash

if [ $USER == 'root' ]
then
        echo "hey admin"
else
        echo "hi guest"
fi

[root@shell tmp]# whoami 
root
[root@shell tmp]# sh if-2.sh 
hey admin

[root@shell tmp]# su - harry -c "sh /tmp/if-2.sh"
hi guest

四、if…elif…else

适用范围:两个以上的判断结果,也就是多于一个以上的判断条件。

if [ condition 1]       满足第一个条件

     then          真

            command1    执行 command1 代码块
elif [ condition 2]     满足第二个条件
 
     then           真

             commands2  执行 command2 代码块

  .......
else         如果条件都不满足

            commandsX    执行 commandX 代码块
fi    结束判断

通过一段代码演示一下吧,通过一个脚本,判断两个整数的关系

案例需求
判断内存的使用率

  • 60以下 ok
  • 60以上 黄色警告
  • 70以上 橙色严重警告
  • 80以上 红色警告

案例思考

内存使用率获得方式

  • 手动给出
  • 通过内存查看命令运算得出

案例代码

[root@shell tmp]# vim if-3.sh
#!/bin/bash
#1、条件
#判断内存的使用率
#60以下    ok 绿色  32m
#60以上    黄色警告   33m
#70以上    粉色严重警告 35m 
#80以上    红色警告 31m

#2、算法
#收集内存使用率  $1 # 脚本外传参
#
#多条件判断

if [ $1 -gt 80 ]
then
	echo -e "\033[31m 警告 \033[0m"
elif [ $1 -gt 70 ]
then
	echo -e "\033[35m 警告 \033[0m"
elif [ $1 -gt 60 ]
then
	echo -e "\033[33m 警告 \033[0m"
else
	echo -e "\033[32m OK \033[0m"
fi


# 注意事项:
如果多条件判断存在包含的关系,需要从最严格开始判断;否则,后面的就不会生效
如果你第一个判断的是60以上,那么 70 80 都符合第一个条件。所以后面的判断70  80 就没有任何意义

效果展示

关于脚本外传参:shell 内置变量

  • 本程序的名字: $0
  • 本程序执行进程号是:$$
  • 上条命令执行结果是:$?
  • 传入参数的数量是:$#
  • 传入的第2个参数是:$2
  • 传入的参数列表:$@

脚本外传参的执行方法:脚本名字 参数1 参数2 ...(如上面的脚本执行方式)

脚本内部调用的方法 :$1 $2 ... $N

特点:减少用户交互

五、if 嵌套 if

当有多步判断的时候,可以使用if嵌套

  1. 多步判断。类似于多条件if
  2. 依赖执行的环境 configure -> make-> make install

5.1 使用 if 嵌套 if 的方式判断两个整数的关系

#!/bin/bash

if [ $1 -eq $2 ];then
        echo "$1 = $2"
else
        if [ $1 -gt $2 ];then
                echo "$1 > $2"
        else
                echo "$1 < $2"
        fi
fi

 效果展示

5.2 写一个nginx安装初始化脚本 

案例需求
写一个nginx业务初始化脚本,完成nginx软件自动安装。

案例思考

  1. nginx软件包获得方式
  2. nginx安装流程
  3. nginx安装依赖关系

案例步骤

  1. 软件包下载
  2. 软件包解压
  3. 安装依赖包
  4. 安装nginx
  5. 返回结果

案例代码

[root@shell tmp]# vim nginx_install.sh
#!/bin/bash

source_pkg=nginx-1.19.2.tar.gz
#1、软件包下载
wget http://nginx.org/download/$source_pkg 
#2、解压
if [ -f $source_pkg ];then
	tar xf $source_pkg && cd nginx-1.19.2
else
        echo "not found $source_pkg"
	exit 1
fi

#3、安装依赖包
if ! ( yum -y install pcre-devel zlib-devel );then
      echo "yum: install soft error"
      exit 1
fi

#4、配置
#判断配置语句执行结果
if ./configure 1>/dev/null        
	then
	#判断make执行结果
	     if make 1>/dev/null
		 then
		 #判断make install安装结果
			if make install 1>/dev/null
			   then
			 	echo "nginx 安装成功"
			else
			 	echo "nginx 安装失败"
				exit 1
		        fi
		else
			echo "make fail"
			exit 1
		fi
else
		echo "configure fail"
		exit 1
fi



#./configure 等价于 if [ $? -eq 0 ];then

#注意: 1>/dev/null
1  为标准输出
2  为标准错误输出

六、if 语句与 shell 运算 

6.1 与文件存在与否的判断

-e	是否存在   不管是文件还是目录,只要存在,条件就成立
-f	是否为普通文件
-d	是否为目录
-S	socket
-p	pipe
-c	character
-b	block
-L	软link

案例演示

# 判断/tmp/test目录,如果没有则创建它
[root@shell tmp]# vim if-5.sh
#!/bin/bash

if [ ! -d /tmp/test ];then
	mkdir -pv /tmp/test
fi

[root@shell tmp]# sh if-5.sh 
mkdir: 已创建目录 "/tmp/test"
[root@shell tmp]# ls

6.2 文件权限相关的判断

-r	当前用户对其是否可读
-w	当前用户对其是否可写
-x	当前用户对其是否可执行
-u	是否有suid
-g	是否sgid
-k	是否有t位

 案例演示:

[root@shell tmp]# vim if-6.sh
#!/bin/bash

if [ -x /tmp/test/linux ];then
        /tmp/test/linux
else
        echo "ERROR: no exec"
fi

# 没有文件报错
[root@shell tmp]# sh if-6.sh 
ERROR: no exec
[root@shell tmp]# echo "echo hahha" > /tmp/test/linux

# 没有执行权限报错
[root@shell tmp]# sh if-6.sh 
ERROR: no exec
[root@shell tmp]# chmod 755 /tmp/test/linux 
[root@shell tmp]# sh if-6.sh 
hahha

6.3 整数之间的判断

-eq	    相等
-ne	    不等
-gt	    大于
-lt	    小于
-ge     大于等于
-le	    小于等于


浮点比较运算
比较两个浮点数字的大小
给脚本两个浮点数字   返回他两的关系


#思路
1、获得两个浮点数字
2、处理为整形
3、比较
4、输出

# 案例演示:
#!/bin/bash
#1. 交互或者外传参的方式获得两个整数
#$1 $2
[ $# -lt 2 ]&&echo "need two args" && exit 1

#2. 采用外传参的方式接收数据并放大 100倍,并处理为整数
num1=`echo "scale=2;$1*100" | bc | cut -d "." -f1`
num2=`echo "scale=2;$2*100" | bc | cut -d "." -f1`

#3. 比较运算
if [ $num1 -gt $num2 ];then
    #3、输出结果
    echo "$1 > $2"
elif [ $num1 -lt $num2 ];then
    echo "$1 < $2"
else
    echo "$1 = $2"
fi

6.4 字符串之间的判断

-z                      是否为空字符串       字符串长度为0,就成立
-n                      是否为非空字符串    	只要字符串非空,就是成立
string1 == string2 		是否相等
string1 != string2 		不等

案例演示:

[root@shell tmp]# vim if-7.sh
#!/bin/bash
# 交互式输入用户名 密码
read -p "user: " myuser
if [ -z "$myuser" ];then
        echo "用户名为空!"
        exit 1
fi

# 从外往里写嵌套 if
read -p "password: " mypw
if [ -n "$mypw" ];then
        # 判断用户名
        if [ $myuser == "root" ];then
           # 判断密码
           if [ $mypw == "root" ];then
                   echo "welcome root~"
           else
                   echo "密码错误!"
                   exit 1
           fi
        
        else
         echo "用户名错误!"
                exit 1
        fi              

else
        echo "密码不能为空!"
        exit 1
fi

效果展示:

6.5 多重条件判断

# 逻辑判断符号:
&&  	(and 逻辑与) 		两个条件同时满足,整个大条件为真
||	    (or 逻辑或)		    两个条件满足任意一个,整个大条件为真
! 	    非运算

案例演示:

[root@shell tmp]# vim if-8.sh
#!/bin/bash
# 交互式输入用户名 密码
read -p "user: " myuser
if [ -z "$myuser" ];then
        echo "用户名为空!"
        exit 1
fi

# 从外往里写嵌套 if
read -p "password: " mypw
if [ -n "$mypw" ];then
        if [ $myuser == 'root' ] && [ $mypw == 'abc-123' ];then
                echo "welcome root"
        else
                echo "用户名或密码错误"
                exit 1
        fi

else
        echo "密码不能为空"
        exit 1
fi

效果展示:

七、if 高级用法 

7.1 条件符号使用双圆括号,可以在条件中植入数学表达式 if (())

[root@shell tmp]# vim if-9.sh 
#!/bin/bash

if (( (5+5-5)*5/5 > 10 ))
    then
        echo "yes"
else
        echo "no"
fi

[root@shell tmp]# sh if-9.sh 
no

7.2 使用双方括号,可以在条件中使用通配符

通过代码看下 ,为字符串提供高级功能,模式匹配 r* 匹配 r 开头的字符串:

[root@shell tmp]# vim if-10.sh
#!/bin/bash

for var in  ab ac rx bx rvv vt
   do
       if [[ "$var" == r* ]]
          then
                echo "$var"
       fi
done

[root@shell tmp]# sh if-10.sh 
rx
rvv

八、简写 if 

省去了关键字,条件为真采用 && 符号链接命令块,条件为假采用 || 链接命令块。简写 if 一般用在简单的判断中。

# 案例一
if [ ! -d /tmp/baism ]
    then
        mkdir /tmp/baism
fi

# 可以简写为:
[ ! -d /tmp/baism ] && mkdir /tmp/baism

# 案例二
if [ $USER == 'root' ]
	  then
	      echo "hello root"
else
			  echo "hello guest"
fi

# 可以简写为:
[ $USER == 'root' ] && echo "hello root" || echo "hello guest"


注:把 then 替换为 &&
把 else 替换为 ||

上一篇文章:【Shell 脚本速成】06、Shell 数组详解_Stars.Sky的博客-CSDN博客

参考文档:shell流程控制-if判断语句-组团学

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

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

相关文章

【数据结构】建堆的方式、堆排序以及TopK问题

建堆的方式、堆排序以及TopK问题1、建堆的两种方式1.1 向上调整建堆1.2 向下调整建堆2、堆排序3、TopK问题4、建堆、堆排序、TopK问题全部代码1、建堆的两种方式 我们知道&#xff0c;堆是二叉树的一种&#xff0c;二叉树的建立是借助结构体与数组完成的&#xff08;通过在结构…

扫描电镜下的人体感官结构,超震撼

我们对自己的感官最熟悉不过了&#xff0c;但是如果把这些器官放大一千倍一万倍&#xff0c;你还能分辨出来吗&#xff1f;能做到这一点的不是普通的光学显微镜&#xff0c;而是电子显微镜。 电子显微镜可以将物体放大近300000倍&#xff0c;其分辨率可达1纳米&#xff08;10-9…

Minio学习

目录 一、概述 1、Minio介绍 2、Minio的基础概念 3、Minio安装 3.1、Docker容器中安装 3.2、Windows运行安装 4、分布式Minio优势 数据保护 高可用 一致性 5、Minio客户端使用 6、SpringBoot工程引入Minio 一、概述 Minio分布式文件系统。 Minio是一个基于Apache…

客服回复差评的话术模板

当店铺出现差评时&#xff0c;客服首先要去与客户进行沟通&#xff0c;帮助客户解决问题&#xff0c;尽可能去消除差评&#xff1b;如果客户不愿意沟通&#xff0c;无法消除差评的情况下&#xff0c;客服也要及时对差评进行回复。 前言 对于开网店的店主来说&#xff0c;客户…

如何搭建一个自己的音乐服务器

点赞再看&#xff0c;动力无限。 微信搜「 程序猿阿朗 」。 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录&#xff0c;有很多知识点和系列文章。 最近发现&#xff0c;经常用的网易云音乐&#xff0c;有很多歌曲下架了&#xff0c;能听的越来越少了&#xff1b;…

【电气安全】安科瑞电气火灾监控系统在江苏某大学中设计与应用

摘要&#xff1a;本文以安科瑞电气火灾系统在江苏大学科技园的应用为案例&#xff0c;介绍电气火灾系统实现对现场设备的系统集成&#xff0c;数据的采集、传输以及存储&#xff0c;验证了该系统的功能及实用性。 关键词&#xff1a;江苏大学科技园&#xff1b;电气火灾系统&a…

【数据结构】Map和Set

目录 一、JDK中的Map和Set 1.1Map接口的使用 &#xff08;1&#xff09;元素的添加操作 &#xff08;2&#xff09;在Map集合中查询特定的值 &#xff08;3&#xff09;删除Map中指定的value和key &#xff08;4&#xff09;Map集合的遍历 1.2Set集合的应用 集合java.u…

RK3588平台开发系列讲解(Thermal篇)Thermal的设备树配置

平台内核版本安卓版本RK3588Linux 5.10Android12🚀返回专栏总目录 文章目录 一、Tsadc 配置二、cooling device配置2.1、CPU配置2.2、 GPU配置三、 Thermal Zone配置沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍Thermal的设备树配置方法。 一、Tsadc 配…

【GD32F427开发板试用】+demo的正确打开方式(一)

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动&#xff0c;更多开发板试用活动请关注极术社区网站。作者&#xff1a;四季的温度 这个系列用于汇总我在使用GD32时遇到的问题&#xff0c;为大家排坑 MDK环境准备 打开https://aijishu.com/a/1060000000356925&a…

搜索与图论-树与图的深度优先遍历

文章目录一、树与图的深度优先遍历1. 构造2. 遍历3. 具体实现详见例题——树的重心二、树与图的深度优先遍历例题——树的重心具体实现1. 样例演示2. 实现思路3. 代码注解4. 实现代码DFS 深度优先遍历详见搜索与图论-DFS 一、树与图的深度优先遍历 数与图的深度优先遍历与 DF…

JDK8新特性超详细总结

JDK8新特性 ​ Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机&#xff0c;Java 仍是企业和开发人员的首选开发平台 课程内容的介绍 了解Java发展史Lambda表达式…

DNS轮询是什么

参考文章&#xff1a;DNS轮询是什么&#xff1f; DNS轮询简单来说就是一个域名解析多个IP地址。那么为什么会有DNS轮询呢&#xff1f;一般DNS轮询用于访问量较大的网站&#xff0c;由于一台服务器无法承载&#xff0c;所以准备了多台服务器组成集群做负载均衡&#xff0c;这些服…

使用Mac编写Thirft的HelloWorld项目

前言 最近在hive新增Thirft接口&#xff0c;于是学习了一下Thirft的使用 步骤 准备工作 brew install thrift安装thrift创建maven项目并引入依赖 <dependency><groupId>org.apache.thrift</groupId><artifactId>libthrift</artifactId><v…

led护眼灯哪种品牌质量好?2022什么牌子的护眼灯最好推荐

现在绝大部分台灯都是使用led灯珠作为发光源&#xff0c;这不仅仅是led灯珠本身的优秀&#xff0c;也更是市场的选择&#xff0c;无论是光线照度、显色性&#xff0c;还是亮度、色温的可调控性&#xff0c;led护眼灯都有非常明显的优势&#xff0c;对保护眼睛起到非常大的作用。…

微信小程序开发平台

微信小程序开发平台顾名思义就是一个可以开发小程序的地方。 微信小程序开发平台&#xff1a;【电脑浏览器输入3M.FKW.COM了解详情】 适合群体&#xff1a;企业、机构、个体户 微信小程序开发平台方式&#xff1a; 自建——可以通过套用小程序模板&#xff0c;利用拖拽式小…

ADSP-21489的开发详解:VDSP+自己编程写代码开发(3-可能出现的故障和解决办法)

如果连接失败怎么办&#xff1f;软件报错&#xff0c;无法进入上图所示的状态&#xff1f;不用担心&#xff0c;ADI 的 Visual DSP软件提供了自带的 TEST 功能&#xff0c;能通过软件分析&#xff0c;得出故障原因&#xff0c;并排除。 发现 ADI 仿真器连不上开发板&#xff0c…

浏览器执行过程与V8引擎执行原理(无惧面试)

前言&#xff1a;一文带你理解&#xff0c;浏览器渲染过程以及V8引擎背后执行原理&#xff0c;让你知道页面在浏览器上显示出来背后都做了什么事情。这将是一个js高级系列第一篇&#xff0c;这将会为之后的闭包&#xff0c;作用域链&#xff0c;原型等让人迷惑的知识打基础。感…

使用IDEA 进行 安卓开发

使用IDEA 进行 安卓开发 前言 以前使用Eclipse 进行 Android 开发&#xff0c;感觉对新手来说实在是太不友好了&#xff0c;又是Android SDK&#xff0c;有是配 gradle 等一系列的东西&#xff0c;对与新手而言&#xff0c;总是遗漏。或者版本对不上&#xff0c;一堆问题&…

.net core 读取配置的几种方式

json配置文件示例 {"Logging": {"LogLevel": {"Default": "Information","Microsoft.AspNetCore": "Warning"}},"Account": {"username": "zhangsan","password":&quo…

arXiv2022-12 | FLIP:Scaling Language-Image Pre-training via Masking

凯明团队新作。 论文地址&#xff1a;https://arxiv.org/abs/2212.00794 一、问题 Even using high-end infrastructures, the wall-clock training time is still a major bottleneck hindering explorations on scaling vision-language learning. 即使使用高端的基础设施…