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程序。
 	then
 	 	echo "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文件。 
 	then
 	 	echo "$FILE exists"			#有文件输出exists。
    else
 	 	echo "$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.log
 	else	
 	 	/etc/rc.d/init.d/httpd start &> /dev/null
 	 	echo "$(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条件语句只能判断准确的字符串

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Python学习(八)——异常处理】

Python学习(八)——异常处理 本文介绍了异常处理的知识,仅作为本人学习时记录,感兴趣的初学者可以一起看看,欢迎评论区讨论,一起加油鸭~~~ 心中默念:Python 简单好学!!&…

Python 爬虫验证码识别

在我们进行爬虫的过程中,经常会碰到有些网站会时不时弹出来验证码识别。我们该如何解决呢?这里分享 2 种我尝试过的方法。 0.验证码示例 1.OpenCV pytesseract 使用 Python 中的 OpenCV 库进行图像预处理(边缘保留滤波、灰度化、二值化、…

[离线数仓] 总结二、Hive数仓分层开发

接 [离线数仓] 总结一、数据采集 5.8 数仓开发之ODS层 ODS层的设计要点如下: (1)ODS层的表结构设计依托于从业务系统同步过来的数据结构。 (2)ODS层要保存全部历史数据,故其压缩格式应选择压缩比率,较高的,此处选择gzip。 CompressedStorage - Apache Hive - Apac…

GraphQL:强大的API查询语言

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

vue js实现时钟以及刻度效果

2025.01.08今天我学习如何用js实现时钟样式&#xff0c;效果如下&#xff1a; 一、html代码如下&#xff1a; <template><!--圆圈--><div class"notice_border"><div class"notice_position notice_name_class" v-for"item in …

Docker入门之docker基本命令

Docker入门之docker基本命令 官方网站&#xff1a;https://www.docker.com/ 1. 拉取官方镜像并创建容器&#xff08;以redis为例&#xff09; 拉取官方镜像 docker pull redis# 如果不需要添加到自定义网络使用这个命令&#xff0c;如需要&#xff0c;直接看第二步 docker r…

“深入浅出”系列之FFmpeg:(1)音视频开发基础

我的音视频开发大部分内容是跟着雷霄骅大佬学习的&#xff0c;所以笔记也是跟雷老师的博客写的。 一、音视频相关的基础知识 首先播放一个视频文件的流程如下所示&#xff1a; FFmpeg的作用就是将H.264格式的数据转换成YUV格式的数据&#xff0c;然后SDL将YUV显示到电脑屏幕上…

【JAVA基础】Collections方法的具体使用方法

java基础中Collections及collect(toList,toSet,toMap)的用法 package com.gaofeng;import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream;public class demo01 {public static void main(String[] …

深度学习知识点:RNN

文章目录 1.简单介绍2.网络结构3.应对梯度消失 1.简单介绍 循环神经网络&#xff08;RNN&#xff0c;Recurrent Neural Network&#xff09;是一类用于处理序列数据的神经网络。与传统网络相比&#xff0c;变化不是特别大&#xff0c;不如CNN的变化那么大。 为什么要有循环神经…

超完整Docker学习记录,Docker常用命令详解

前言 关于国内拉取不到docker镜像的问题&#xff0c;可以利用Github Action将需要的镜像转存到阿里云私有仓库&#xff0c;然后再通过阿里云私有仓库去拉取就可以了。 参考项目地址&#xff1a;使用Github Action将国外的Docker镜像转存到阿里云私有仓库 一、Docker简介 Do…

MySQL学习笔记(二)

一、SQL-函数 函数-介绍 函数是指一段可以直接被另一段程序调用的程序或代码。 字符串函数 示例 --concat select concat(Hello,MySql); --upper select upper(Hello); --lpad select lpad(01,5,-); --trim select trim( Hello MySQL ); --中间空格还在&#xff0c;头尾…

java mail 535 Login Fail. Please enter your authorization code to login

报错信息提示查看 https://service.mail.qq.com/detail/0/53 帮助页面意思就是说你要使用授权码登录, 但是授权码我已经正确的设置上去了 后面从 QQ邮箱出现错误 Please enter your authorization code to_邮件群发-双翼邮件群发软件官方网 看到 账户 需要是 QQ号 例如…

mysql、postgresql、druid链接池踩坑记录

The last packet successfully received from the server wIs 10,010 milliseconds ago. The last packet sent successfully to the server was 10,010 milliseconds ago.### The error may exist in URL mysql 链接字符串没有 &connectTimeout600000&socketTimeout6…

安卓NDK视觉开发——手机拍照文档边缘检测实现方法与库封装

一、项目创建 创建NDK项目有两种方式&#xff0c;一种从新创建整个项目&#xff0c;一个在创建好的项目添加NDK接口。 1.创建NDK项目 创建 一个Native C项目&#xff1a; 选择包名、API版本与算法交互的语言&#xff1a; 选择C版本&#xff1a; 创建完之后&#xff0c;可…

Spring Boot教程之五十二:CrudRepository 和 JpaRepository 之间的区别

Spring Boot – CrudRepository 和 JpaRepository 之间的区别 Spring Boot建立在 Spring 之上&#xff0c;包含 Spring 的所有功能。由于其快速的生产就绪环境&#xff0c;使开发人员能够直接专注于逻辑&#xff0c;而不必费力配置和设置&#xff0c;因此如今它正成为开发人员…

【网页自动化】篡改猴入门教程

安装篡改猴 打开浏览器扩展商店&#xff08;Edge、Chrome、Firefox 等&#xff09;。搜索 Tampermonkey 并安装。 如图安装后&#xff0c;浏览器右上角会显示一个带有猴子图标的按钮。 创建用户脚本 已进入篡改猴管理面板点击创建 脚本注释说明 name&#xff1a;脚本名称。…

spark汇总

目录 描述运行模式1. Windows模式代码示例 2. Local模式3. Standalone模式 RDD描述特性RDD创建代码示例&#xff08;并行化创建&#xff09;代码示例&#xff08;读取外部数据&#xff09;代码示例&#xff08;读取目录下的所有文件&#xff09; 算子DAGSparkSQLSparkStreaming…

Spring AMQP-保证发送者消息的可靠性

1. 消息发送者的可靠性 保证消息的可靠性可以通过发送者重连和发送者确认来实现 发送者重连 发送者重连机制就是在发送信息的时候如果连接不上mq不会立即结束&#xff0c;而是会在一定的时间间隔之类进行重新连接&#xff0c;连接的次数和时间都是由我们在配置文件中指定的&…

vs2022编译webrtc步骤

1、主要步骤说明 概述&#xff1a;基础环境必须有&#xff0c;比如git&#xff0c;Powershell这些&#xff0c;就不写到下面了。 1.1 安装vs2022 1、选择使用C的桌面开发 2、 Windows 10 SDK安装10.0.20348.0 3、勾选MFC及ATL这两项 4、 安装完VS2022后&#xff0c;必须安…

UnityWebGl:打包成webgl后UGUI不显示文字(中文)问题

是由于unity默认使用的是Arial,导致打包成webgl时中文不显示 解决方案&#xff1a; 可在电脑C盘下&#xff0c;路径为C:\Windows\Fonts 找个中文简体的字体文件放到unity里面&#xff0c;格式必须为. ttf