shell-条件判断

目录

一、条件判断

1.按照文件类型进行判断

2.按照文件权限进行判断

3.两个文件之间进行比较

4.两个整数之间进行比较

5.字符串的判断

6.多重条件判断

二、if条件判断

1.单分支if条件语句

2.双分支if条件语句

(1)判断某文件是否存在

(2)重启服务

3.多分支if条件语句

三、多分支case条件语句

if条件语句可以判断范围类型,case条件语句只能判断准确的字符串


一、条件判断

1.按照文件类型进行判断

类型       作用
-b文件判断该文件是否存在,并且是否为块设备文件(是块设备文件为真)块设备是I/O设备中的一类,是将信息存储在固定大小的块中,每个块都有自己的地址,还可以在设备的任意位置读取一定长度的数据。例如U盘,SD卡。
-c 文件判断该文件是否存在,并且是否为字符设备文件(是字符设备文件为真) 字符设备是指在I/O传输过程中以字符为单位进行传输的设备例如键盘,打印机。
-d 文件判断该文件是否存在,并且是否为目录文件(是目录为真)
-e 文件判断该文件是否存在(存在为真)
-f 文件判断该文件是否存在,并且是否为普通文件(是普通文件为真)
-L 文件判断该文件是否存在,并且是否为符号连接文件(是符号连接文件为真)
-p 文件判断该文件是否存在,并且是否为管道文件(是管道文件为真)
-s 文件判断该文件是否存在,并且是否为非空(非空为真)
-S 文件判断该文件是否存在,并且是否为套接字文件(是套接字文件为真)

使用[]括号来进行判断,利用$?来检测判断结果。

[root@localhost ~]# [ -e /etc/passwd ] 
[root@localhost ~]# echo $?
0			 
[root@localhost ~]# [ -e /etc/test ] 
[root@localhost ~]# echo $?
1

此命令还可以结合之前所学的&&和||再来进行判断:

[root@localhost ~]# [ -d /etc/passwd ] && echo "yes" || echo "no" 
no
[root@localhost ~]# [ -d /etc/ ] && echo "yes" || echo "no" 
yes
#第一个判断命令如果正确执行打印yes,否则打印no。

2.按照文件权限进行判断

选项作用
-r 文件判断该文件是否存在,并且是否该文件拥有读权限(有读权限为真)
-w 文件判断该文件是否存在,并且是否该文件拥有写权限(有写权限为真)
-x 文件判断该文件是否存在,并且是否该文件拥有执行权限(有执行权限为真)
-u 文件判断该文件是否存在,并且是否该文件拥有SUID权限(有SUID权限为真)
-g 文件判断该文件是否存在,并且是否该文件拥有SGID权限(有SGID权限为真)
-k 文件判断该文件是否存在,并且是否该文件拥有SBit权限(有SBit权限为真)

3.两个文件之间进行比较

选项作用
文件1 -nt 文件2判断文件1的修改时间是否比文件2的新(如果新则为真)
文件1 -ot 文件2判断文件1的修改时间是否比文件2的旧(如果旧则为真)
文件1 -ef 文件2

判断文件1是否和文件2的inode号一致,可以理解为两个文件是否为同一个文件。

(这个判断用于判断硬链接是很好的方法。)

4.两个整数之间进行比较

选项作用
整数1 -eq 整数2判断整数1是否和整数2相等(相等为真)
整数1 -ne 整数2判断整数1是否和整数2不相等(不相等为真)
整数1 -gt 整数2判断整数1是否大于整数2(大于为真)
整数1 -lt 整数2判断整数1是否小于整数2(小于为真)
整数1 -ge 整数2判断整数1是否大于等于整数2(大于等于为真)
整数1 -le 整数2判断整数1是否小于等于整数2(小于等于为真)

5.字符串的判断

选项作用
-z 字符串判断字符串变量是否为空(为空返回真)
-n 字符串判断字符串变量是否为非空(非空返回真)
字串1 == 字串2判断字符串1变量是否和字符串2变量相等(相等返回真)
字串1 != 字串2判断字符串1变量是否和字符串2变量不相等(不相等返回真)

#字串! = = 字串2 在test变量测试当中通过man查询并没有这种= =的操作,而是通过单个等于号进行测试判断的,在/etc/profile文件中判断umask就是使用的单个等于号=来进行的变量测试。=单个等于号是规范的书写格式。

6.多重条件判断

选项作用
判断1 -a 判断2逻辑与,判断1和判断2都成立,最终的结果才为真。
判断1 -o 判断2逻辑或,判断1和判断2有一个成立,最终的结果就为真。
!逻辑非,使原始的判断式取反。
[root@localhost ~]# aa=11 	 
[root@localhost ~]# [ -n "$aa" -a "$aa" -gt 23 ] && echo "yes" || echo "no" 
no 	 	 	 	 
[root@localhost ~]# aa=24 	 
[root@localhost ~]# [ -n "$aa" -a "$aa" -gt 23 ] && echo "yes" || echo "no" 
yes#逻辑非:
[root@localhost ~]# [ ! -n "$aa" ] && echo "yes" || echo "no" 
no

二、if条件判断

1.单分支if条件语句

       单分支条件语句最为简单,就是只有一个判断条件,如果符合条件则执行某个程序,否则什么事情都不做。语法如下:

if [条件判断式] ;then 程序
fi

单分支条件语句注意:

if语句使用fi结尾,和一般语言使用大括号结尾不同。

[条件判断式]中括号和条件判断式之间必须有空格。

       then后面跟符合条件之后执行的程序,可以放在[]之后,用;分隔。也可以换行写入, 就不需要“;”了。比如: 

if [条件判断式] then程序
fi 

例:

[root@localhost ~]# cat if1.sh 
#!/bin/bash
rate=$(df -h | grep "/dev/sda3" | awk '{print $5}' | cut -d "%" -f1)
#分区使用率赋值rate,df -h 命令截取/dev/sda3,awk截取第五列,cut指定分隔符为%并显示第一行。
if [ $rate -ge 80 ]
#判断rate的值如果大于等于80则执行then程序。thenecho "warning! /dev/sda3 is full!!!" 
#打印警告信息。在实际工作中可以向管理员发送邮件。
fi

2.双分支if条件语句

if [条件判断式]then 条件成立时,执行的程序。else条件不成立时,执行的另一个程序。
fi

(1)判断某文件是否存在

[root@localhost ~]# cat check_file.sh 
#!/bin/bash
read -p "Please input a file:" FILE #赋值FILE。
if [ -e $FILE ]						#检测是否有FILE文件。 thenecho "$FILE exists"			#有文件输出exists。elseecho "$FILE not exists"		#没有文件输出not exists。
fi

(检查文件是否存在,给脚本执行权限。然后运行脚本,输入要检测的文件名。) 

(2)重启服务

[root@localhost ~]# cat autostart.sh 
#!/bin/bash
port=$(nmap -sT 192.168.22.222 | grep tcp | grep http | awk '{print $2}') 
if [ "$port" == "open" ]then	echo "$(date) httpd is ok!" >> /tmp/autostart-acc.logelse	/etc/rc.d/init.d/httpd start &> /dev/nullecho "$(date) restart httpd!!" >> /tmp/autostart-err.log
fi

(首先用nmap命令查看是否开启apache并赋值给port。

然后进行条件判断。如果服务开启,输出当前时间+httpd is ok 到/tmp/autostart- acc.log。

如果变量port的值不是open,那么执行else下操作。首先启动apache服务,将启动后信息输出至位桶,然后在/tmp/autostart-err.log中记录。在本次脚本中nmap命令使用的是IP查找端口,但并未指DNS,所以会报DNS不存在的错,但不影响结果。)

3.多分支if条件语句

if [条件判断式1]then当条件判断式1成立时,执行程序1。
elif [条件判断式2]then当条件判断式2成立时,执行程序2。
......(可加入更多条件) 
else当所有条件不成立时,最后执行此程序。
fi

例:用多分支条件语句判断一下用户输入的是一个文件还是一个目录:

[root@localhost ~]# cat if-elif.sh 
#!/bin/bash
#接收键盘输入并赋予变量file。
read -p "Please input you filename:" file
if [ -z "$file" ]	#判断file变量是否为空。then #如果为空,输出报错信息。echo "Error,please input a filename"
#判断file的值是否存在。
elif [ ! -e "$file" ]then #如果不存在,输出此信息。echo "your input is not file"
#判断file的值是否为普通文件。
elif [ -f "$file" ]then#如果是普通文件输出此信息。echo "$file is a regulare file"
#判断file是否是目录文件。
elif [ -d "$file" ]then#如果是目录文件输出此信息。echo "$fiel is a directory!"
#如果都不是则执行本程序。
else#都不是的话输出此信息。echo "$file is an other file!"
fi

三、多分支case条件语句

       case语句和if..elif...else语句一样都是多分支条件语句,不过和if多分支条件语句不同的是,case语句只能判断一种条件关系,而if语句可以判断多种条件关系。case语句语法如下:

case $变量名 in “值1”)如果$变量等于值1,则执行程序1;; “值2”)如果$变量等于值2,则执行程序2;;....省略...*)如果$变量的值不是以上值,则执行此程序;;
esac

case语句需注意以下内容:

       case语句,会取出变量中的值,然后与语句体中的值逐一比较。如果数值符合,则执行对应的程序,如果数值不符,则一次比较下一个值。如果所有的值都不符合,则执行“*”中的程序。*):代表所有其他值。

       case语句以case开头,以esac结尾。每个分支程序之后都要通过;;双分号结尾,代表该程序段结束。

例:

[root@localhost ~]# cat case.sh 
#!/bin/bash
read -t 5 -p "Please choose yes/no:" ch	#接收键盘输入并赋值ch,等待5秒提示信息。
case $ch in "yes")echo "your choose is yes"	#如果变量ch为yes,输出此信息。;;"no")echo "your choose is no"	#如果变量ch为no,输出此信息。;;*)echo "your choose is error"	#当变量ch不是yes/no的时候输出此信息。;;
esac

if条件语句可以判断范围类型,case条件语句只能判断准确的字符串

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

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

相关文章

基于FPGA的出租车里程时间计费器

基于FPGA的出租车里程时间计费器 功能描述一、系统框图二、verilog代码里程增加模块时间增加模块计算价格模块上板视频演示 总结 功能描述 (1);里程计费功能:3公里以内起步价8元,超过3公里后每公里2元,其中…

jdk8升级JDK21(Springboot2.7.18升级Springboot3.4.0)

目录 背景: 一、maven升级 二、代码改造 2.1 javax替换为jakarta 2.2 swagger2升级swagger3相关更新 2.2.1 新增SpringDocConfig配置类 2.2.2 全局代码更新 2.2.3 全局代码替换(普通正则替换) 2.3 Mybatis Plus升级 2.4 logback.xm…

AI赋能跨境电商:魔珐科技3D数字人破解出海痛点

跨境出海进入狂飙时代,AI应用正在深度渗透并重塑着跨境电商产业链的每一个环节,迎来了发展的高光时刻。生成式AI时代的大幕拉开,AI工具快速迭代,为跨境电商行业的突破与飞跃带来了无限可能性。 由于跨境电商业务自身特性鲜明&…

【HarmonyOS NEXT】鸿蒙应用实现屏幕录制详解和源码

【HarmonyOS NEXT】鸿蒙应用实现屏幕录制详解和源码 一、前言 官方文档关于屏幕录制的API和示例介绍获取简单和突兀。使用起来会让上手程度变高。所以特意开篇文章,讲解屏幕录制的使用。官方文档参见:使用AVScreenCaptureRecorder录屏写文件(ArkTS) 二…

Android - NDK:编译可执行程序在android设备上运行

在android开发中,调试时会把C代码直接编译成可执行程序,运行在android设备上以确认其功能是否正常。 1、基于NDK编译可执行文件 2、push到 /data/local/tmp目录下 3、设置权限,执行。 ndk工程中build.gradle设置 groovy plugins {id com.a…

用matlab调用realterm一次性发送16进制数

realterm采用PutString接口进行发送,需要注意的是发送的16进制数前面要加入0x标志。只有这样,realterm才能将输入的字符串识别为16进制数的形式。 另外,PutString函数支持两个参数输入,第一个参数为字符串,第二个参数为发送形式&…

Python3刷算法来呀,贪心系列题单

1.7号题单 1、​​​​​​k次取反后最大值 2、柠檬水找零 3、分发糖果 示例 1: 输入:ratings [1,0,2] 输出:5 解释:你可以分别给第一个、第二个、第三个孩子分发 2、1、2 颗糖果。示例 2: 输入:ratings…

el-table拖拽表格

1、拖拽插件安装 npm i -S vuedraggable // vuedraggable依赖Sortable.js,我们可以直接引入Sortable使用Sortable的特性。 // vuedraggable是Sortable的一种加强,实现组件化的思想,可以结合Vue,使用起来更方便。 2、引入拖拽函数…

Unity学习笔记(七)使用状态机重构角色攻击

前言 本文为Udemy课程The Ultimate Guide to Creating an RPG Game in Unity学习笔记 攻击状态重构 首先我们重构攻击状态的动画 之前的动画,我们是使用状态(isAttacking)攻击次数(comboCounter)完成动画的过渡,这样虽然能完成功能,但是如…

Windows10环境下安装RabbitMq折腾记

最近有个老项目需要迁移到windows10环境,用的是比较老的rabbitmq安装包,如下所示。经过一番折腾,死活服务起不来,最终果断放弃老版本启用新版本。现在把折腾过程记录下: 一、安装erlang 安装完成后的目录结构&#xff…

了解RabbitMQ中的Exchange:深入解析与实践应用

在分布式系统设计中,消息队列(Message Queue)扮演着至关重要的角色,而RabbitMQ作为开源消息代理软件的佼佼者,以其高性能、高可用性和丰富的功能特性,成为了众多开发者的首选。在RabbitMQ的核心组件中&…

分布式主键ID生成方式-snowflake雪花算法

这里写自定义目录标题 一、业务场景二、技术选型1、UUID方案2、Leaf方案-美团(基于数据库自增id)3、Snowflake雪花算法方案 总结 一、业务场景 大量的业务数据需要保存到数据库中,原来的单库单表的方式扛不住大数据量、高并发,需…

Linux 系统搭建网络传输环境汇总

Ubuntu 系统搭建 TFTP 服务器 1. 创建 /home/username/workspace/tftp 目录并赋予最大权限,username 是自己用户名 sudo mkdir -p /home/username/workspace/tftp sudo chmod 777 /home/username/workspace/tftp 2. 安装 tftp-hpa( 客户端软件包&#x…

“AI智慧语言训练系统:让语言学习变得更简单有趣

大家好,我是你们的老朋友,一个热衷于探讨科技与教育结合的产品经理。今天,我想和大家聊聊一个让语言学习变得不再头疼的话题——AI智慧语言训练系统。这个系统可是我们语言学习者的福音,让我们一起来揭开它的神秘面纱吧&#xff0…

线性代数考研笔记

行列式 背景 分子行列式:求哪个未知数,就把b1,b2放在对应的位置 分母行列式:系数对应写即可 全排列与逆序数 1 3 2:逆序数为1 奇排列 1 2 3:逆序数为0 偶排列 将 1 3 2 只需将3 2交换1次就可以还原原…

精选2款.NET开源的博客系统

前言 博客系统是一个便于用户创建、管理和分享博客内容的在线平台,今天大姚给大家分享2款.NET开源的博客系统。 StarBlog StarBlog是一个支持Markdown导入的开源博客系统,后端基于最新的.Net6和Asp.Net Core框架,遵循RESTFul接口规范&…

关于FPGA中添加FIR IP核(采用了GOWIN EDA)

文章目录 前言一、IP核二、MATLAB文件三、导出系数COE文件1.设计滤波器2.用官方的matlab代码或者直接用文本文件 四、进行模块化设计源文件 前言 FIR滤波器的特点是其输出信号是输入信号的加权和,权值由滤波器的系数决定。每个系数代表了滤波器在特定延迟位置上的“…

51单片机——中断(重点)

学习51单片机的重点及难点主要有中断、定时器、串口等内容,这部分内容一定要认真掌握,这部分没有学好就不能说学会了51单片机 1、中断系统 1.1 概念 中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的,中断功能的存在&#…

VVenC 编码器源码结构与接口函数介绍

VVenC VVenC(Fraunhofer Versatile Video Encoder)是由德国弗劳恩霍夫海因里希研究所(Fraunhofer Heinrich Hertz Institute, HHI)开发的一个开源的高效视频编码器。它实现了最新的视频编码标准——Versatile Video Coding (VVC)…

耗时一天,我用AI开发了AI小程序

小码哥从事前后端开发近十年,但是随着技术的更新迭代,有时候没有时间和精力去优化UI、实现一些前后端功能,以及解决一些bug。特别是我想开发小码哥AI的移动端,但觉得自己没有那么多时间去研究移动端了,准备放弃了&…