5.shell if判断语句

shell-if判断语句

        • 1.什么是if
        • 2.为什么要用if
        • 3.if基础语法
        • 4.基于文件进行判断
        • 5.基于整数比对
        • 6.基于字符比对
        • 7.基于正则比对

1.什么是if

if其实就是模仿人类的判断来进行的,要么真、要么假、就这两种结果。

2.为什么要用if

判断

3.if基础语法

单条件

if [ 如果你有房 ];then
    那就嫁
fi

双条件

if [ 如果你有房 ];then       #真
嫁
else          #假
不嫁
fi

多条件

if [ 如果你有房 ];then
嫁
elif [ 如果你有车 ];then
嫁
elif [ 人很帅 ];then
嫁
......
else
再见

fi

案例1:
单分支,判断当前用户是不是root1,如果不是那么返回“ERROR”
可以通过环境变量$USER判断当前用户
echo $USER
在这里插入图片描述

#!/bin/bash

if [ $USER != "root1" ];then
	echo "ERROR!"
fi

在这里插入图片描述


案例2:
双分支,判断当前登录用户是管理员还是普通用户,如果是管理员输出”hey admin“ 如果是普通用户输出”hey guest“

#如何辨别是管理员还是普通用户:环境变量 $UID 只要为0 就一定是管理员 否则都是普通用户
在这里插入图片描述

#!/bin/bash

if [ $UID -eq 0 ];then  #$UID等于0,输出hey admin
	echo "hey admin"
else						#否则输出hey guest
	echo "hey guest"
fi

在这里插入图片描述


案例3:
多分支,根据输入一个用户名称,判断输入的用户是否存在当前系统,如不存在则再次判断用户是否在/home下拥有家目录,如果都没有则提示不存在

#!/bin/bash

read -p "输入一个用户名:" user

user1=$(cat /etc/passwd|grep $user|wc -l)

if [ $user1 -ne 0 ];then
	echo "$user 存在当前系统"
elif [ -e /home/$user ];then
	echo "$user 在/home下拥有家目录"
else
	echo "$user 不存在"
fi


4.基于文件进行判断

用来备份时,需要使用

在这里插入图片描述

if [ -f /etc/hosts ];then
    		文件存在怎么样
    		else
    		文件不存在怎么样
    fi

案例1:
备份/etc/hosts文件至/backup/system/filename-2024-03-11,如果该目录不存在则自动创建。

1.判断目录是否存在,不存在则创建
2.cp备份,并重命名

#!/bin/bash

dest=/backup/system

if [ ! -d $dest  ];then #如果目录不存在,就创建目录
	mkdir -p $dest

fi

cp -rp /etc/hosts $dest/filename-$(date +%F) #执行备份操作

在这里插入图片描述


案例2:
继需求1,判断备份的文件是否存在,如果不存在则提示”No such file or directory“,然后退出

#!/bin/bash

dest=/backup/system

#1.判断备份的目录是否存在
if [ ! -d $dest  ];then
	mkdir -p $dest
fi

#2.提示用户需要备份原文件
read -p "输入你要备份的文件" src

#3.判断用户输入的源文件是否存在,如果不存在则报错,退出
if [ ! -f $src ];then
	echo "$src No such file or directory"
	exit
fi

#4.如果文件存在,则直接执行拷贝操作
cp -rp $src $dest/


在这里插入图片描述

在这里插入图片描述


案例3:
继需求1、2,判断备份的文件是否为空,如果为空则提示"This is file empty",然后退出。

#!/bin/bash

dest=/backup/system

if [ ! -d $dest  ];then
	mkdir -p $dest

fi

read -p "输入你要备份的文件" src

if [ ! -f $src ];then  
	echo "$src No such file or directory"
	exit
fi

if [ ! -s $src ];then  #4.判断文件是否为空,如果为空,则报错。
	echo "This is file empty"
	exit
fi

cp -rp $src $dest/

在这里插入图片描述


5.基于整数比对

用来判断服务是否正常、选择时

在这里插入图片描述

案例1:
用户执行脚本,sh status.sh nginx,则检查nginx服务的运行状态。(仅支持传递一个参数)

#1.如何判断nginx的状态
0 启动
3 未启动
在这里插入图片描述

#!/bin/bash

#1.判断执行脚本的身份是不是root用户
if [ $USER != "root" ];then
	echo "请使用root用户执行该脚本"
	exit
fi

#2.判断用户传递的参数,$#总共传递的参数个数是
if [ $# -ne 1 ];then
	echo "请按照正确格式执行脚本: sh $0  [ nginx | vsftpd | httpd ] "
	exit
fi

systemctl status $1 &> /dev/null  #将原本输出到屏幕的信息重定向到 /dev/null
if [ $? -eq 0 ];then  #判断上一条命令执行返回的结果
	echo "$1 是启动状态"
else
	echo "$1 未启动状态"
fi


在这里插入图片描述

在这里插入图片描述


案例2:
查看磁盘/当前使用状态,如果使用率超过30%则报警

#!/bin/bash

diskuse=$(df -h|awk '/\/$/{print $(NF-1)}')  #获取到磁盘使用的百分比

if [ ${diskuse%\%} -ge 30 ];then #先将结果替换成整数,然后再与预先设定的值进行比较
	echo "warning!磁盘使用率为 $diskuse"
else
	echo "磁盘正常,当前使用率为 $diskuse"
fi

在这里插入图片描述


6.基于字符比对

用来判断是不是root用户执行,如果不是则拒绝执行脚本
在这里插入图片描述

不等于
#!/bin/bash

#1.判断执行脚本的身份是不是root用户
if [ $USER != "root" ];then
	echo "请使用root用户执行该脚本"
	exit
fi


 等于
    #!/bin/bash
    if [ $USER == "root" ];then
        echo "hey admin"
    else
        echo "hey guest"
    fi
#!/bin/bash

read -p "请输入一个字符:" action

if [ -z $action ];then  #字符串长度为0,则执行输出指令
	echo "请输入有效的字符"
	exit
fi

在这里插入图片描述


7.基于正则比对

用来判断用户输入的是不是全整数,输入的是不是全小写、或大写

  if [[ $USER =~ ^r ]];then		#如果USER变量的结果匹配 r开头则表达式成立

  fi 

案例1:
通过正则的方式控制用户输入的必须是纯数字。

#!/bin/bash

read -p "输入一个纯数字" num

 #判断$num的结果是否匹配以数字开头,数字出现一次或多次,以数字结尾,不匹配就输出报错信息
if[[! $num =~ ^[0-9]+$]];then 
	echo "输入的必需是纯数字"
	exit

在这里插入图片描述


案例2:
编写一个创建用户的脚本。
1.提示用户输入要创建用户的前缀,必须是英文。
2.提示用户输入后缀,必须是数字。
3.如果前缀和后缀都没有问题,则进行用户创建。

思路梳理:

id 用户名 ,如果执行返回的结果是0,说明用户已存在
在这里插入图片描述

#!/bin/bash

read -p "输入用户名前缀:" qz

if [[ ! $qz =~ ^[a-z]+$ ]];then
	echo "前缀必须是英文"
	exit
fi

read -p "输入用户名后缀:" hz

if [[ ! $hz =~ ^[0-9]+$ ]];then
	echo "后缀必须是数字"
	exit
fi

username=$qz$hz

id $username &> /dev/null #将原本输出到屏幕的错误信息与普通信息全都重定向到/dev/null(所有输出都丢弃)

if [ $? -eq 0 ];then  
	echo "${username} 已存在"
else
	useradd $username
	echo "${username} 创建成功"
fi


在这里插入图片描述


案例3:
创建qwe01至qwe12 这12个用户

#!/bin/bash
source /etc/init.d/functions 
#在shell脚本中,你可以通过source命令或者.操作符来调用/etc/init.d/functions库文件中定义的函数

read -p "输入用户名前缀:" qz

if [[ ! $qz =~ ^[a-z]+$ ]];then
	echo "前缀必须是英文"
	exit
fi

read -p "输入用户名后缀:" hz

if [[ ! $hz =~ ^[0-9]+$ ]];then
	echo "后缀必须是数字"
	exit
fi

#将用户输入的数字,进行序列化一下
for i in $(seq -w $hz ) #1至$hz按序列输出$hz的结果
do
username=$qz$i
id $username &> /dev/null

if [ $? -eq 0 ];then
	action "${username} 已存在" /bin/false   #action 也是输出的意思,类似于echo,但功能略有不同/bin/true显示效果为OK,/bin/false显示效果为FAILED
else
	useradd $username
	action "${username} 创建成功" /bin/true
fi
done

执行结果:
在这里插入图片描述


案例4:
判断nginx服务是否正常启动

#!/bin/bash

ngx_status=$(pidof nginx|wc -l)

if [ $ngx_status -eq 1 ];then
	echo "nginx 服务正常"
else
	echo "nginx 服务异常"
fi

在这里插入图片描述


案例5:

写一个Nginx安装脚本,加入判断,当上一步执行成功在执行下一步,否则退出脚本,
安装完成后,判断一下是否没有问题,配置完后,判断一下是否没有问题,最后启动,启动后检查没有问题,则提示用户可以访问了。

这里使用了编译的方式安装的nginx

思路梳理:
大概分为:安装、配置、启动 这三个大步骤

日常手动编译安装的基本步骤:

下载 nginx软件wget http://nginx.org/download/nginx-1.23.1.tar.gz

解压 tar xf nginx-1.23.1.tar.gz

进入nginx目录 cd /nginx-1.23.1

配置安装选项 ./configure --prefix=/etc/nginx 

编译和安装 make && make install

启动nginx 
/usr/sbin/nginx -t 
/usr/sbin/nginx

查看结果

通过脚本实现这些步骤

#!/bin/bash

source /etc/init.d/functions #引入库方便后续使用

#判断/opt下是否存在源码包 ,-e 如果文件或目录存在则为真
if [ -e /opt/nginx-1.23.1.tar.gz ];then #如果/opt下存在源码包,就跳过下载的步骤
	echo "源码包已存在无需再次下载"
else     #如果/opt下不存在源码包,就下载到指定的路径/opt下
	wget -P /opt http://nginx.org/download/nginx-1.23.1.tar.gz &>/dev/null
	if [ $? -eq 0 ];then #上一个命令执行的返回结果没有问题就表示下载成功
        	action "nginx 下载" /bin/true
	else
        	action "nginx 下载" /bin/false
		exit
	fi
fi

#安装nginx的依赖
yum install -y gcc pcre pcre-devel zlib zlib-devel &>/dev/null
if [ $? -eq 0 ];then  #上一个命令执行的返回结果没有问题就表示安装nginx的依赖成功
	action "nginx 依赖安装" /bin/true
else
	action "nginx 依赖安装" /bin/false
	exit
fi

#进入/opt下,解压包并进入解压后的nginx路径
cd /opt
tar xf nginx-1.23.1.tar.gz && cd nginx-1.23.1

if [ $? -eq 0 ];then  #上一个命令执行的返回结果没有问题就表示解压成功进入路径成功
	action "nginx 源码包解压" /bin/true
	echo "Makefile生成中..."
	./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx  #配置安装选项
	#--prefix=<path> -- 安装路径,如果没有指定,默认为/usr/local/nginx。
    #--sbin-path=<path> -- nginx可执行命令的文件,如果没有指定,默认为<prefix>/sbin/nginx
	if [ $? -eq 0 ];then #上一个命令执行的返回结果没有问题就表示配置安装选项成功
		action "nginx Makefile生成" /bin/true
		make && make install  #编译和安装
		if [ $? -eq 0 ];then #上一个命令执行的返回结果没有问题就表示编译和安装成功
			action "nginx 编译和安装" /bin/true
		else
			action "nginx 编译和安装" /bin/false
			exit
       		fi
	else
		action "nginx Makefile生成" /bin/false
		exit
	fi

else
	action "nginx 源码包解压" /bin/false
	exit
fi


#nginx systemd服务单元文件创建
cat >/etc/systemd/system/nginx.service<< EOF
[Unit]
Description=The NGINX HTTP and reverse proxy server #描述Service的信息 
After=network.target #表示nginx.service在network.target 单元之后启动      

[Service]
Type=forking
PIDFile=/etc/nginx/logs/nginx.pid  #配置安装选项过程中会显示,一般是/安装路径/logs/nginx.pid
ExecStartPre=/usr/sbin/nginx -t  #定义启动服务前执行的指令
ExecStart=/usr/sbin/nginx  #定义启动程序执行的指令
ExecReload=/usr/sbin/nginx -s reload #重启服务时执行的命令
ExecStop=/usr/sbin/nginx -s quite  #停止服务时执行的命令
PrivateTmp=true  
#PrivateTmp,使用Systemd这个进程作为启动进程的linux系统,其子进程都会有PrivateTmp这么一个属性,用于设置是否使用私有的tmp目录,/tmp目录一般是所有用户和所有service都共享的,把各个service的tmp目录隔开的话,可以保证一定的安全性。

[Install]
#配置开机自启动
WantedBy=multi-user.target
EOF

if [ $? -eq 0 ];then #上一个命令执行的返回结果没有问题就表示服务文件创建成功
        systemctl daemon-reload #重新加载systemd管理配置,然后就可以使用systemctl控制nginx了,不然还需要使用绝对路径来控制nginx服务的启动停止。
        action "nginx systemd服务单元文件创建" /bin/true
        echo "可使用 systemctl [ start | stop | status | reload | enable ] nginx 控制nginx服务!"
else
        action "nginx systemd服务单元文件创建" /bin/false
        echo "请手动配置 '/etc/systemd/system/nginx.service' 文件"
        exit
fi


#配置文件语法验证,验证不报错的话,就可以启动nginx了
#/usr/sbin/nginx -t 以绝对路径的方式,验证配置文件语法是否正确
nginx -t #直接验证配置文件语法是否正确
if [ $? -eq 0 ];then #上一个命令执行的返回结果没有问题就表示语法正确
	action "nginx 配置文件验证" /bin/true
	systemctl start nginx #以systemctl命令控制nginx启动
	#/usr/sbin/nginx  以绝对路径控制nginx启动
	if [ $? -eq 0 ];then #上一个命令执行的返回结果没有问题就表示成功启动
		 action "nginx 启动" /bin/true
	else
		 action "nginx 启动" /bin/false
		 exit
	fi
else
	action "nginx 配置文件验证" /bin/false
	echo "存在语法错误"
	exit
fi


#查看返回头部信息中的HTTP状态码,进行判断,等于200的话就是请求成功,成功返回了请求的资源
status_code=$(curl -I -s http://localhost |awk 'NR==1{print $2}') #-I 仅输出HTTP请求头 -s 静默模式,不输出额外的信息
if [ $status_code -eq 200 ];then
	echo "index页面访问正常"
else
	echo "index页面访问异常 服务返回状态码:$status_code "
fi

执行效果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

大概就这样了,这里写的啰嗦了,还可以继续优化


案例6:

在每月13号,备份并压缩/etc目录的所有内容,存放到/opt/bak目录,
存放的形式为: 年-月-日_etc.tar.gz

思路梳理:
1.备份什么 /etc目录
2.备份到哪 /opt/bak (有没有这个目录,有待考究,没有的话还的创建这个目录)
3.备份时间 每月13号

#!/bin/bash

destdir=/opt/bak #备份到的目录
date=$(date +%F) #日期格式
day=$(date +%d) #输出日,这个月的哪一日

#判断要备份到的目录是否存在,不存在的话还的创建这个目录
if [ ! -d $destdir  ];then 
	mkdir -p $destdir
fi

#判断今天是不是13号,是的话进行备份操作
if [ $day == 13 ];then
	cd /
	tar cfz ${destdir}/${date}_etc.tar.gz etc/  #tar cfz 压缩后文件名.tar.gz 打包的目录
fi

赋予可执行权限
chmod 777 /tmp/bak.sh

加入定时任务 crontab -e 查看定时任务 crontab -l

 0 0 * * * /tmp/bak.sh #每天执行一次脚本

在这里插入图片描述

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

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

相关文章

RocketMQ快速入门

RocketMQ快速入门 准备工作下载RocketMQ环境要求 JDK下载安装JDK下载JDK安装 安装RocketMQ安装步骤目录介绍 启动RocketMQ测试RocketMQ发送消息接收消息 关闭RocketMQ RocketMQ是阿里巴巴2016年开源的MQ中间件&#xff0c;使用Java语言开发&#xff0c;在阿里内部&#xff0c;R…

String、StringBuilder、StringBuffer 有什么区别?

1、典型回答 String、StringBuilder 和 StringBuffer 都是 Java 语言中&#xff0c;用于操作字符串的类&#xff0c;但它们在性能、可变性和线程安全性方面有一些区别 1、String&#xff1a;不可变字符串类&#xff0c;也就是说一旦创建&#xff0c;它的值就不可变。每次对 S…

数据库基础理论知识

1.基本概念 数据(Data)&#xff1a;数据库存储的基本对象。数字、字符串、图形、图像、音频、视频等数据库(DB)&#xff1a;在计算机内&#xff0c;永久存储、有组织、可共享的数据集合数据库管理系统(DBMS)&#xff1a;管理数据库的系统软件数据库系统(DBS):DBDBMSDBADBAP 数…

【spring】-多模块构建二-问题整理

1、bean注入问题 The injection point has the following annotations: - org.springframework.beans.factory.annotation.Autowired(requiredtrue) 解决1&#xff1a; 由于引入的bean类 不属于启动类的子模块下&#xff0c;需要在启动类手动声明扫描的类 也适用于公共子模…

Ribbon-负载均衡

目录 一、负载均衡的作用位置 二、Ribbon负载均衡的工作流程 三、IRule接口 负载均衡的策略&#xff1a; 修改负载均衡策略&#xff08;即修改使用的IRule接口的实现类&#xff09;&#xff1a; 四、饥饿加载 五、总结 前置知识&#xff1a;Eureka注册中心 不熟悉Eureka的…

【Emgu CV教程】9.3、形态学常用操作之开运算

文章目录 一、相关概念1.什么叫开运算3.开运算的函数 二、演示1.原始素材2.代码3.运行结果 一、相关概念 1.什么叫开运算 腐蚀、膨胀已经讲完&#xff0c;这两个是最基础的形态学操作。这次讲的是开运算&#xff0c;它是一个先腐蚀、后膨胀的过程。原始图像先被腐蚀&#xff…

使用Anaconda创建Python指定版本的虚拟环境

由于工作的需要和学习的需要&#xff0c;需要创建不同Python版本的虚拟环境。 比如zdppy的框架&#xff0c;主要支持的是Python3.8的版本&#xff0c;但是工作中FastAPI主要使用的是3.11的版本&#xff0c;所以本地需要两套Python环境。 决定使用Anaconda虚拟环境管理的能力&…

发那科数控机床FanucCNC(NCGuide)仿真模拟器配置和数据采集测试

开发日记3.12 此篇用于记录发那科数控机床(Fanuc CNC)采集程序开发中&#xff0c;用虚拟机做测试时&#xff0c;虚拟机的配置和使用以支持采集软件开发和测试。 配置虚拟机使用仿真软件 下载VMware15 「链接&#xff1a;https://pan.xunlei.com/s/VNsl9Gmb14ANBiiNlsT7vA2LA…

Chrome下载B站视频字幕的插件

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

多模态大模型Claude 3正式接入集简云与语聚!对标GPT-4且支持中文

自OpenAI发布GPT-4以来&#xff0c;引发了业务模式与应用使用的巨大变革&#xff0c;掀起了各大企业对于多模态大模型的研究热潮。3月初&#xff0c;AnthropicClaude在官网正式发布Claude 3系列多模态大模型&#xff0c;据了解&#xff0c;该模型在多个维度上超越了GPT-4&#…

Vcenter 定制创建 Rocky Linux 虚拟机

文章目录 1. 图形化安装2. 初始化配置 1. 图形化安装 2. 初始化配置 Centos 8.2 指南

图像分割损失函数

为什么要乘以2&#xff0c;是为了让DICE的值域在0和1之间 优化&#xff1a;两种LOSS相加 Focus loss:

C++的类和对象(六):友元、内部类

目录 友元 友元函数 友元类 内部类 匿名对象 拷贝对象时的一些编译器优化 再次理解类和对象 友元 基本概念&#xff1a;友元提供了一种突破封装的方式&#xff0c;有时提供了便利&#xff0c;但是友元会增加耦合度&#xff0c;破坏了封装&#xff0c;所以友元不宜多用&…

力扣--课程表--bfs+dfs

整体思路&#xff1a; 这是一道拓扑序列的题目&#xff0c;我们将边的方向定义成从先修课指向后修课的方向&#xff0c;借一下官方的题解图片&#xff0c;我们需要判断的是形成的这个图结构是否存在环&#xff0c;如果存在环&#xff0c;那么代表不能完成所有课程的学习。 bfs思…

2.Datax数据同步之Windows下,mysql和sqlserver之间的自定义sql文数据同步

目录 前言步骤操作大纲步骤明细mysql 至 sqlServersqlServer 至 mysql执行同步语句中报 前言 上一篇文章实现了不同的mysql数据库之间的数据同步&#xff0c;在此基础上本篇将实现mysql和sqlserver之间的自定义sql文数据同步 准备工作&#xff1a; JDK(1.8以上&#xff0c;推…

学习vue3第四节(ref以及ref相关api)

主要记录以下api&#xff1a;ref()、isRef()、unref()、 shallowRef()、triggerRef()、customRef() 1、ref() 定义 接受一个内部值&#xff0c;返回一个响应式的、可更改的 ref 对象&#xff0c;此对象只有一个指向其内部值的属性 .value&#xff0c;.value属性用于追踪并且存…

数据结构 第1章:绪论

文章目录 1. 绪论1.1. 数据结构 1.2. 算法1.2.1. 算法的基本概念1.2.2. 算法的时间复杂度1.2.3. 算法的空间复杂度 1. 绪论 程序 数据结构 算法 1.1. 数据结构 数据&#xff1a;是对客观事物的符号表示&#xff0c;在计算机科学中是指所有能输入到计算机中并被计算机程序处理…

记录一个Typora激活方法(附软件)!!!

前言 今天想体验Typora上的picList功能&#xff0c;手一抖给版本升级到最新的1.8.10&#xff0c;然后就提示我激活&#xff0c;让我输入序列号&#xff0c;如图所示。接着我就去百度找教程&#xff0c;于是乎就出现了这一篇文章。 教程开始 1、下载最新版 先去官网下载最新…

使用canvas绘制超炫时钟

HTML5 Canvas相当于一个画板&#xff0c;你可以在Canvas绘制任意的东西&#xff0c;今天要分享一款利用HTML5 Canvas绘制的超炫时钟的方法及代码&#xff0c;非常的漂亮&#xff0c;这里推荐给大家 代码地址 使用canvas绘制超炫时钟

R统计学2 - 数据分析入门问题21-40

往期R统计学文章&#xff1a; R统计学1 - 基础操作入门问题1-20 21. 如何对矩阵按行 (列) 作计算&#xff1f; 使用函数 apply() vec 1:20 # 转换为矩阵 mat matrix (vec , ncol4) # [,1] [,2] [,3] [,4] # [1,] 1 6 11 16 # [2,] 2 7 12 17 # [3,] …