当前位置: 首页 > news >正文

shell编程之条件语句

shell编程之条件语句

  • 一、条件测试操作
    • 1.test命令
    • 2.文件测试
    • 3.利用条件判断,创建文件
    • 4.整数值比较
      • 4.1 常用的测试操作符
    • 5.字符串比较
      • 5.1 常用的测试操作符
    • 6.逻辑测试
      • 6.1 常用的测试操作符
  • 二、if语句的结构
    • 1.单分支结构
    • 2.双分支结构
    • 3.多分支结构
    • 4.if嵌套
  • 三、case语句结构
    • 1.case多分支结构


前言
在shell脚本程序中,各条语句将按先后顺序依次执行,从而实现批量处理的自动化过程。通过正确使用if语句,进行条件测试操作,使Shell脚本具有一定的“判断”能力,以根据不同的条件来完成不同的管理任务。从而减轻了管理员本身的负担,提升工作效率。


一、条件测试操作

1.test命令

  • 测试表达式是否成立,若成立返回0,否则返回其他数值
  • 格式:
格式一:test 条件表达式
格式二:[ 条件表达式 ]     //中括号和表达式中间至少应有一个空格

2.文件测试

要使 Shell脚本程序具备一定的"智能",面临的第一个问题就是如何区分不同的情况以确定执行何种操作。例如,当磁盘使用率超过95%时,发送告警信息;当备份目录不存在时,能够自动创建;当源码编译程序时,若配置失败则不再继续安装等shell环境根据命令执行后的返回状态值 $? 来判断是否执行成功,当返回值为 0 时表示成功,否则(非0值)表示失败或异常。使用专门的测试工具——test 命令,可以对特定条件进行测试,并根据返回值来判断条件是否成立(返回值为0表示条件成立)。


  • 语法格式:

      [ 操作符 文件或目录 ]
    
  • 常用的测试操作符

-d:测试是否为目录(Directory)
-e:测试目录或文件是否存在(Exist)
-f:测试是否为文件(File)
-r:测试当前用户是否有权限读取(Read)
-w:测试当前用户是否有权限写入(Write)
-x:测试当前用户是否有权限执行(eXcute)
-b:测试是否为设备文件
-c:测试是否为字符设备文件
-s:测试存在且文件大小为空
-L:测试是否为链接文件

执行条件测试操作以后,通过预定义变量 $ ? 可以获得测试命令的返回状态值,
从而判断该条件是否成立。
  • 例如,执行以下操作可测试目录/media/是否存在,如果返回值 $? 为 0,表示存在此目录,否则表示不存在或者虽然存在但不是目录
[root@c7-1 home]# test -d /etc/sysconfig/ && echo "是目录"  //如果前面的命令成功了, 则运行后面的命令,返回结果 是目录;&&是而且的意思
是目录
[root@c7-1 home]# echo $?
0
#存在此目录[root@c7-1 home]# [ -d /home/dashiji/ ]  
[root@c7-1 home]# echo $?
1
#目录不存在[root@c7-1 home]# useradd dashiji
[root@c7-1 home]# [ -d /home/dashiji/ ] && echo "YES"  
YES
[root@c7-1 home]# echo $?
0

3.利用条件判断,创建文件

[root@c7-1 home]# ls /opt      //查看opt下没有dashiji文件
rh
[root@c7-1 home]# [ ! -e /opt/dashiji ] && mkdir /opt/dashiji
#感叹号取反 -e 测试目录或文件是否存在 ,若不存在 则创建[root@c7-1 home]# echo $?
0
[root@c7-1 home]# ls /opt/   
dashiji  rh
#再次查看opt下已经有了dashiji

4.整数值比较

  • 格式:
[ 整数1 操作符 整数2 ]
整数值比较指的是根据给定的两个整数值,判断第一个数与第二个数的关系,如是否大于、等
于、小于第二个数。整数值比较的常用操作选项如下,使用时将操作选项放在要比较的两个整
数之间。

4.1 常用的测试操作符

-eq:第一个数等于(Equal)第二个数。
-ne:第一个数不等于(Not Equal)第二个数。
-gt:第一个数大于( Greater Than)第二个数。
-lt:第一个数小于(Lesser Than)第二个数。
-le:第一个数小于或等于(Lesser or Equal)第二个数。
-ge:第一个数大于或等于(Greater or Equal)第二个数

例:

[root@c7-1 home]# who | wc -l   //统计几个远程终端
3
[root@c7-1 home]# [ $(who | wc -l ) -le 5 ] && echo "用户太少"
用户太少
#判断远程终端是否小于等于五,若小于等于,则再运行后面的命令,echo "用户太少"[root@c7-1 home]# [ $(who | wc -l ) -ge 2 ] && echo "用户太多"
用户太多[root@c7-1 home]# Freec=$(free -m | grep "Mem:" | awk '{print $6}')
#定义变量Freec,检索Men,并打印其中第六列
[root@c7-1 home]# [ $Freec -lt 1024 ] && echo ${Freec}MB
416MB
#判断Freec是否小于1024,若小于;则运行 echo ${Freec}MB 

5.字符串比较

格式一:
[ 字符串1 = 字符串2 ]
[ 字符串1 != 字符串2 ]格式二:
[ -z 字符串 ]

5.1 常用的测试操作符

= :字符串内容相同;第一个字符串与第二个字符串相同。
!= :第一个字符串与第二个字符串不相同,!号表示相反的意思
-z :检查字符串是否为空(Zero),对于未定义或赋予空值的变量将视为空串。

例:

[root@c7-1 ~]# echo $LANG
zh_CN.UTF-8
[root@c7-1 ~]# [ $LANG != "en.US" ] && echo "not en.US"
not en.US
#测试语言环境,判断是否为英文,LANG等不等于en.US,若不等于,执行后面的命令 not en.US[root@c7-1 ~]# read -p "yes/no: " ACK
yes/no: ^C
[root@c7-1 ~]# [ -z $ACK ] && echo "你的变量是空字符" 
你的变量是空字符

6.逻辑测试

逻辑测试指的是判断两个或多个条件之间的依赖关系。当系统任务取决于多个不同的条件时,
根据这些条件是否同时成立或者只要有其中一个成立等情况,需要有一个测试的过程
格式1:
[ 表达式1 ] 操作符 [ 表达式2 ]格式2:
命令1 操作符 命令2

6.1 常用的测试操作符

-a 或 && 	:逻辑与,“而且”的意思,只有当前后两个条件都成立时,整个测试命令的返回值﹐才
为0(结果成立)。使用test命令测试时, && 可改为 -a
-o 或 || 	:逻辑或,“或者”的意思,只要前后两个条件中有一个成立,整个测试命令的返回值即
为0(结果成立)。使用test命令测试时, || 可改为 -o
!			:逻辑否,表示"不",只有当指定的条件不成立时,整个测试命令的返回值才为0(结果
成立)。

例:

[root@c7-1 ~]# [ -d /etc ] && [ -r /etc ] && echo "you can open it"
you can open it
#只有前后两个条件都成立,才能返回0[root@c7-1 ~]# [ -d /etc/ ] || [ -d /opt/ ] && echo ok
ok
#有一个条件成立即可[root@c7-1 ~]# Munm=$(uname -r | awk -F. '{print $1}')
[root@c7-1 ~]# echo $Munm 
3
[root@c7-1 ~]# Snum=$(uname -r | awk -F. '{print $2}')
[root@c7-1 ~]# echo $Snum 
10
[root@c7-1 ~]# [ $Munm -ge 3 ] && [ $Snum -ge 6 ] && echo true
true
#查看当前Linux系统的内核版本是否大于3.4

二、if语句的结构

1.单分支结构

格式:if 条件测试操作then 命令序列fi

在这里插入图片描述
例:

[root@c7-1 ~]# vim test1.sh#!/bin/bash					//固定格式
if ls /opt > /dev/dull		//if条件测试判断,查看是否有opt目录,并把输出信息给黑洞
then						//条件成立echo "it is ok"		//则echo一个it is ok
fi							//fi 结束判断[root@c7-1 ~]# chmod +x test1.sh  //给权限
[root@c7-1 ~]# ./test1.sh 			//执行
it is ok
[root@c7-1 ~]# vim test2.sh#!/bin/bash
MOUNT_DIR="/mnt/centos7"				//定义变量
if [ ! -e $MOUNT_DIR ]					//if判断 是否/mnt/centos7 不存在 
then									//条件成立mkdir "/mnt/centos7"			//创建 /mnt/centos7 echo "$MOUNT_DIR 并不存在,现已创建"	//输出返回值
fi										//fi 结束判断[root@c7-1 ~]# chmod +x test2.sh    	//给与权限
[root@c7-1 ~]# ./test2.sh 				//执行
/mnt/centos7 并不存在,现已创建
[root@c7-1 ~]# ls /mnt
centos7
[root@c7-1 ~]# vim test3.sh#!/bin/bash
read -p "请输入文件名:" fileif [[ $file = *.sh ]]
thenecho "这是一个shell脚本"
fi[root@c7-1 ~]# ./test3.sh 
请输入文件名:test1.sh
这是一个shell脚本

2.双分支结构

格式:if 条件测试操作then 命令序列1else 命令序列2fi

在这里插入图片描述
例:

[root@c7-1 ~]# vim test4.sh#!/bin/bashIP=192.168.3.101				//定义变量ping -c 2 -i 0.2 -W 3 $IP &> /dev/null	//ping2次,输出给黑洞if [ $? -eq 0 ];then			//判断$?是否等于0echo "$IP is up"		//条件成立输出 IP is up
else							//条件不成立echo "$IP is down"		//输出 IP is down
fi[root@c7-1 ~]# ./test4.sh 
192.168.3.101 is up
[root@c7-1 ~]# ./test4.sh 
192.168.3.101 is down
[root@c7-1 ~]# vim test5.sh#!/bin/bash
if [ $UID -eq 0 ];thenecho "当前登陆用户是管理员root"
elseecho "当前登陆用户不是管理员root"
fi
[root@c7-1 ~]# sh test5.sh 
当前登陆用户是管理员root[root@c7-1 ~]# cp test5.sh /home/zhangsan/
[root@c7-1 ~]# cd /home/zhangsan/
[root@c7-1 zhangsan]# chmod +x test5.sh 
[root@c7-1 zhangsan]# su zhangsan
[zhangsan@c7-1 ~]$ ./test5.sh 
当前登陆用户不是管理员root

3.多分支结构

#格式:if 条件测试操作1then 命令序列1elif 条件测试操作2then 命令序列2else命令序列3fi

在这里插入图片描述

例:

[root@c7-1 zhangsan]# vim test6.sh#!/bin/bash
read -p "请输入您的分数(0-100)" GRADEif [ $GRADE -ge 85 ] && [ $GRADE -le 100 ]		//判断$GRADE 是否大于85小于100
thenecho "$GRADE 分,优秀"   				//条件满足则输出,不满足则继续往下进行判断elif [ $GRADE -ge 60 ] && [ $GRADE -le 84 ]   	//判断是否大于60小于84
then											echo "$GRADE 分,合格"					elif [ $GRADE -ge 100 ]
thenecho "请输入分数为0~100"
else											//以上条件都不成立echo "$GRADE 分,不合格"
fi

4.if嵌套

[root@c7-1 ~]# vim httpd.sh#!/bin/bash
pgrep -l httpd			//查找httpd进程
if [ $? -ne 0 ]			//判断是否在运行
then					//条件成立则if [ "$(rpm -q httpd)"="未安装软件包 httpd" ]		//判断httpd是否安装then											//条件成立yum install -y httpd					//没安装则安装systemctl start httpd					//启动服务echo "httpd服务已安装启动"				//输出已启动else											//若以上条件不成立systemctl start httpd					//启动httpdecho "httpd服务已启动"					//输出服务已启动fi												//结束判断
else					//若以上条件都不成立	echo "httpd is running"		//则输出running
fi						//结束判断
[root@c7-1 ~]# vim user.sh#!/bin/bash
read -p "请输入用户名:" user					//定义交互式变量
if grep $user /etc/passwd &>/dev/dull		//条件测试,判断是否有这个用户并输入给黑洞
then										//条件成立 则if [ -d /home/$user ]				//判断用户是否有家目录then								//若条件成立echo "该用户状态正常"			//输出状态正常else								//若以上条件都不成立read -p "该用户没有家目录,是否删除该用户,请输入[yes/no]:" ask	//定义交互式变量if [ $ask == yes ]			//判断输入的是不是yesthen						//若条件成立echo "正在删除用户。。。"		//输出userdel $user &>/dev/null;sleep 2	//删除该用户并延迟两秒echo "该用户已删除"			//输出elif [ $ask == no ]			//条件测试2,判断输入的是不是nothen						//若条件成立exit				//退出fi							//结束判断fi									//结束判断else				//若以上条件都不成立echo "该用户不存在"	//输出一个该用户不存在
fi					//结束判断

三、case语句结构

1.case多分支结构

格式:
case 变量值 in
模式1)命令序列1;;
模式2)命令序列2;;………*)默认命令序列
esac

例:

[root@c7-1 ~]# vim test7.sh#!/bin/bash
case $1 in
start)
/usr/bin/systemctl $1 httpd
/usr/bin/ps aux | grep httpd
echo "httpd start"
;;stop)
/usr/bin/systemctl $1 httpd
/usr/bin/ps aux | grep httpd
echo "httpd stop"
;;restart)
echo "httpd stop......"
/usr/bin/ps aux | grep httpd
/usr/bin/systemctl $1 httpd
echo "httpd restart......"
/usr/bin/ps aux |grep httpd
;;status)
/usr/bin/systemctl $1 httpd
;;
*)
echo "plases inpunt start|stop|restart|status"
esac

相关文章:

shell编程之条件语句

shell编程之条件语句 一、条件测试操作1.test命令2.文件测试3.利用条件判断,创建文件4.整数值比较4.1 常用的测试操作符 5.字符串比较5.1 常用的测试操作符 6.逻辑测试6.1 常用的测试操作符 二、if语句的结构1.单分支结构2.双分支结构3.多分支结构4.if嵌套 三、case…...

【Python每日十题菜鸟版--第二天】

菜鸟实例 🍉前言1.判断奇偶性2.判断闰年3. 获取最大值最小值4. 质数(素数)的判断5.阶乘方法一方法二 6.九九乘法表7.斐波那契数列方法一 :循环计算法(一般方法)方法二: 递归 8.阿姆斯特朗数9. 十…...

拓扑排序模板及例题

概念 一个有向无环图必然存在一个拓扑序列与之对应。 流程: 先将所有入度为0的节点入队将队列中的节点出队,出队序列就是对应拓扑序。对于弹出的节点x,遍历x所有出度y,对y进行入读减一操作检查入度减一之后的节点y,…...

linux查看nginx安装路径

linux查看nginx安装路径 有几种方法可以查看nginx的安装路径: 使用which命令: which nginx这个命令会返回nginx的二进制文件路径,一般也是安装路径。 查看nginx的进程,得到安装路径: ps aux | grep nginx输出结果中有nginx的进程路径,这个也是安装路径。 在nginx的配置文…...

【生态环境保护】绿水青山就是金山银山——生态环保篇

环保是一个持续性的话题,不仅仅是在国内,整个世界都是一个命运共同体从城市垃圾分类,到农村/村镇污水治理,城乡一体化和因地制宜的实施方式,是我们一直在探索的。 从余村到全国,从中国到世界,“…...

配置Docker镜像加速器-Docker命令-Docker 容器的数据卷

Docker架构 docker进程(daemon) 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件…...

ARM开发调试方法

用户选用ARM处理器开发嵌入式系统时,选择合适的开发工具可以加快开发进度,节省开发成本。因此一套含有编辑软件、编译软件、汇编软件、链接软件、调试软件、工程管理及函数库的集成开发环境(IDE)一般来说是必不可少的,…...

【Spring篇】IOC/DI注解开发

🍓系列专栏:Spring系列专栏 🍉个人主页:个人主页 目录 一、IOC/DI注解开发 1.注解开发定义bean 2.纯注解开发模式 1.思路分析 2.实现步骤 3.注解开发bean作用范围与生命周期管理 1.环境准备 2.Bean的作用范围 3.Bean的生命周期 4.注解开发依赖…...

1 Unix基础知识

1.1 登录 1.1 登录名 登录Unix系统时,要先输入登录名,然后再输入口令。系统再其口令文件(/etc/password文件)查看登录名。口令文件中的登录项由7个以冒号分隔的字段组成:登录名,加密口令,数字用…...

【翻译一下官方文档】认识uniCloud云数据库(基础篇)

我将用图文的形式,把市面上优质的课程加以自己的理解,详细的把:创建一个uniCloud的应用,其中的每一步记录出来,方便大家写项目中,做到哪一步不会了,可以轻松翻看文章进行查阅。(此文…...

全局解释器锁 GIL

问题 你已经听说过全局解释器锁 GIL,担心它会影响到多线程程序的执行性能。 解决方案 尽管 Python 完全支持多线程编程,但是解释器的 C 语言实现部分在完全并行执行时并不是线程安全的。 实际上,解释器被一个全局解释器锁保护着&#xff…...

github 下载文件加速 https://moeyy.cn/gh-proxy/

GitHub文件链接带不带协议头都可以,支持release、archive以及文件,右键复制出来的链接都是符合标准的。 注意,不支持项目文件夹,请使用Git。 分支源码:https://github.moeyy.xyz/https://github.com/moeyy/project/arc…...

第五章 资源包使用

游戏开发中会大量使用模型文件,图片文件,这些资源都需要事先导入到项目中去。导入的方式非常简单,将这些文件直接复制到项目中的Assets目录下即可。Unity 会在文件添加到 Assets 文件夹时自动检测到这些文件并同步显示在Project视图中。 Uni…...

Linux od命令

Linux od命令用于输出文件内容。 od指令会读取所给予的文件的内容&#xff0c;并将其内容以八进制字码呈现出来。 语法 od [-abcdfhilovx][-A <字码基数>][-j <字符数目>][-N <字符数目>][-s <字符串字符数>][-t <输出格式>][-w <每列字符…...

【15】SCI易中期刊推荐——电子电气 | 仪器仪表(中科院4区)

💖💖>>>加勒比海带<<<💖💖 🍀🍀>>>【YOLO魔法搭配&论文投稿咨询】<<<🍀🍀 ✨✨>>>学习交流 | 温澜潮生 | 合作共赢 | 共同进步<<<✨✨ 📚📚>>>人工智能 | 计算机视觉 | 深度学习Tr…...

基于PaddleServing的串联部署 ocr 识别模型

要点&#xff1a; 使用paddleserving服务 1 首先需要安装PaddleServing部署相关的环境 PaddleServing是PaddlePaddle推出的一种高性能、易扩展、高可用的机器学习服务框架。PaddleOCR中使用PaddleServing主要是为了将训练好的OCR模型部署到线上环境&#xff0c;提供API服务&a…...

java OutputStream学习

1.概要 OutputStream位于java.io&#xff0c;它在Java 实现的IO类库中是一个很基础的抽象类。在层级上&#xff0c;是所有字节输出流类的父类&#xff0c;在功能上&#xff0c;表示接受字节并把它们输出。 2.实现类及子类简介 OutputStream有诸多子类&#xff1a; ByteAr…...

java 上传文件生成二进制流文件

最近在项目中遇到一个问题&#xff1a;需要将上传的文件生成输出流&#xff0c;然后将输出流转换为输入流上传到oss。 -------------------------------------------导出代码实现---------------------------------------------------------- ByteArrayOutputStream baos nu…...

质量小议22 -- 多少分合适

60分万岁~&#xff1f;&#xff1f;&#xff1f;&#xff01;&#xff01;&#xff01; 如果用分数评价质量&#xff0c;多少分合适&#xff1f;60&#xff0c;70&#xff0c;80...还是100&#xff0c;或者 120 对于质量的提升&#xff0c;是雪中送炭&#xff0c;还是锦上添…...

变频器参数设定说明

使用默贝克MT110-0R4-S2B实现下面的练习题&#xff1a; 1、先恢复出厂设置&#xff0c;再输入电机参数&#xff0c;选择静态调谐 2、两种运行模式&#xff1a;多段速&#xff08;8段&#xff09;和简易PLC&#xff08;4段&#xff09; 3、面板启停&#xff0c;运行模式通过外部…...

实用调试技巧

目录&#xff1a; 1.什么是bug&#xff1f; 2.调试是什么&#xff1f;有多重要&#xff1f; 3.debug和release的介绍 4.Windows环境调试介绍 5.一些调试的实例 6.如何写出好(易于调试)的代码 7.编程常见的错误 1.什么是bug&#xff1f; bug--->臭虫、虫子。 为什么含…...

谁是液冷行业真龙头?疯狂的液冷技术!

“人工智能领域AIGC”、“ChatGPT”、“数据特区”、“东数西算”、“数据中心”&#xff0c;可以说是2023年最热的概念&#xff0c;算力提升的背后&#xff0c;处理器的功耗越来越高&#xff0c;想发挥出处理器的最高性能&#xff0c;需要更高的散热效率。 算力井喷之下&…...

自动化运维工具之Ansible

目录 一、自动化运维 1、通过xshell自动化运维 2、Ansible简介 3、Ansible特点及优势 4、Ansible核心程序 5、Ansible工作原理及流程 6、部署Ansible自动化运维工具 7、Ansible常用模块 (1) ansible命令行模块 (2) command模块 (3) shell模块 (4) cron模块 (5) us…...

霍兰德人格分析雷达图

雷达图 Radar Chart 雷达图是多特性直观展示的重要方式 问题分析 霍兰德认为&#xff1a;人格兴趣与职业之间应有一种内在的对应关系 人格分类&#xff1a;研究型、艺术型、社会型、企业型、传统型、现实性 职业&#xff1a;工程师、实验员、艺术家、推销员、记事员、社会工…...

《Odoo开发者模式必知必会》—— 缘起

Odoo作为业界优秀的开源商务软件&#xff0c;在全球范围内拥有广泛的使用者。在领英国际&#xff0c;可以搜索到全球很多国家都有大量odoo人才需求的招聘信息。在国内&#xff0c;虽然已经有为数不少的企业&#xff0c;他们或者已经使用odoo&#xff0c;或者正在了解odoo&#…...

Java8的Options介绍

Java8引入了一个名为 Options 的新类&#xff0c;它是一个容器&#xff0c;可以保存单个值或根本不保存任何值。Optional目的是提供一种更优雅的方式来处理 null 值&#xff0c;这通常会导致NullPointerException。在这篇博客文章中&#xff0c;我们将探索如何在 Java8中使用 O…...

SpringBoot 多数据源及事务解决方案

1. 背景 一个主库和N个应用库的数据源&#xff0c;并且会同时操作主库和应用库的数据&#xff0c;需要解决以下两个问题&#xff1a; 如何动态管理多个数据源以及切换&#xff1f; 如何保证多数据源场景下的数据一致性(事务)&#xff1f; 本文主要探讨这两个问题的解决方案…...

tcpdump使用教程

一、概述 tcpdump是一个功能强大的&#xff0c;用于抓取网络数据包的命令行工具&#xff0c;与带界面的Wireshark一样&#xff0c;基于libpcap库构建。这篇文章主要介绍tcpdump的使用。关于如何使用tcpdump的资料中&#xff0c;最有用的就是tcpdump的两个手册。 tcpdump使用手…...

Zynq-7000、FMQL45T900的GPIO控制(五)---linux应用层配置GPIO输出控制

上文中详细阐述了对应原理图MIO/EMIO的编号&#xff0c;怎么计算获取linux下gpio的编号 本文涉及C代码上传&#xff0c;下载地址 Zynq-7000、FMQL45T900的GPIO控制c语言代码资源-CSDN文库 本文详细记录一下针对获取到gpio的编号&#xff0c;进行配置输出模式&#xff0c;并进…...

带你搞懂人工智能、机器学习和深度学习!

不少高校的小伙伴找我聊入门人工智能该怎么起步&#xff0c;如何快速入门&#xff0c;多长时间能成长为中高级工程师&#xff08;聊下来感觉大多数学生党就是焦虑&#xff0c;毕业即失业&#xff0c;尤其现在就业环境这么差&#xff09;&#xff0c;但聊到最后&#xff0c;很多…...