Shell编程之条件语句与case语句

一、条件测试操作

Shell环境根据命令执行后的返回状态值($?)来判断是否执行成功,当返回值为0(真true)时表示成功,返回值为非0值(假false)时表示失败或异常

  • test命令

        测试表达式是否成立,若成立返回为0,否则返回其他数值($?返回值为 0 表示条件成立)

test 条件表达式
[ 条件表达式 ]                    #方括号“[”或“]”与条件表达式之间需要至少一个空格进行分隔

  • 文件测试

[ 操作符 文件或目录 ]
  • 常用的测试操作符
-e测试目录或文件是否存在(Exist)
-d测试是否为目录(Directory)
-f测试是否为文件(File)
-r测试当前用户是否有权限读取(Read)
-w测试当前用户是否有权限写入(Write)
-x测试是否设置有可执行(Excute)权限
-L测试是否为符号链接

  • 整数值比较

[ 整数1 操作符 整数2 ]
  • 常用的测试操作符
-eq等于
-ne不等于
-gt大于
-lt小于
-le小于等于
-ge大于等于

[[ 运算表达式 选项 整数 ]]                    #若进行数学运算则需多加[]
  • 字符串比较

[ 字符串1 = 字符串2 ] 或 [[ 字符串1 == 字符串2 ]]    #相同
[ 字符串1 != 字符串2 ] 或 [[ 字符串1 != 字符串2 ]]   #不相同[ -z 字符串 ]
[[ 字符串1 =~ 字符串2 ]]                             #包含
[  -z  "字符串" ]		#检查字符串是否为空(Zero),对于未定义或赋予空值的变量将视为空串
[  -n  "字符串" ]		#检查是否有字符串存在

  • 逻辑测试

[ 表达式1 ] 操作符 [ 表达式2 ]
命令1 操作符 命令2
[[ 表达式1 操作符 表达式2 ]]                    #&&、||操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话,会报错
  • 常用的测试操作符
-a或&&逻辑与,“而且”的意思,前后条件需都成立
-o或||逻辑或,“或者”的意思,只需前后条件中一个成立
!逻辑否

[ 表达式1 ] && [ 表达式2 ]   [ 表达式1 -a 表达式2 ]    [[ 表达式1 && 表达式2 ]]        #且,要求前后表达式条件都成立
[ 表达式1 ] || [ 表达式2 ]   [ 表达式1 -o 表达式2 ]    [[ 表达式1 || 表达式2 ]]        #或,只需前后表达式条件成立一个即可

[ 表达式1 ] || 命令1                    #如果表达式1成立不会执行或运算符后面的命令1,如果表达式1条件不成立则会执行或运算符后面的命令1 
[ 表达式1 ] && 命令1 || 命令2                    #如果表达式1条件成立则执行命令1,如果表达式1条件不成立则会执行命令2[[ 99+1 -eq 100 ]]                    #若进行数学运算则需多加[]
[ ! 表达式1 ]       #取反,如果表达式1条件成立则最终结果为条件不成立

  • 案例ping方式判断目标主机是否存活
vim ping.sh

#!/bin/bash
IP=$1
ping -c 3 -i 0.5 -W 2 $IP &> /dev/null && echo "$IP online" || echo "$IP off"
-c发送包的个数
-i发送包的间隔时间
-W超时时间
-w多少秒后停止 ping 命令操作

  • 案例判断服务状态
vim XXX.sh

#!/bin/bash
NUM=${ps -elf | grep 进程名 | grep -v "grep" | grep -v "$$" | wc -l}        #$$代表脚本进程
[ $NUM -gt 0 ] && echo '进程名 is starting' || systemctl start 进程名

补充:判断进程是否正在运行的方法

systemctl status 进程服务
netstat -lntup | grep :端口/进程名
ss -lntup | grep :端口/进程名
lsof -i :端口
ps -elf | grep 进程名 | grep -v "grep" | grep -v "$$" | wc -l
pidof 进程名 | wc -w
killall -0 进程名

二、if语句的结构

  • 单分支结构

等效于

[ 条件表达式 ] && 命令
  • 案例已用磁盘空间
vim XXX.sh


#!/bin/bash

#总磁盘空间大小
total=$(df | grep -w / | awk '{print $2}' )
#已使用的磁盘空间大小
used=$(df | grep -w / | awk '{print $3}' )
#磁盘使用率百分比
percent=$(echo "scal=2;${used}/${total}*100" | bc | awk -F. '{print $1}')

if [ $percent -gt 80 ]
    then
    echo "警告!当前磁盘使用率已超过80%!使用率为${percent}%"
fi


chmod +x XXX.sh

bash XXX.sh
  • 双分支结构

等效于·

[ 条件表达式 ] && 命令1 || 命令2
  • 案例端口监听
vim XXX.sh


#!/bin/bash

#netstat -lntp | grep :端口号
#ss -lntp |grep :端口号
losf -i :端口号 &> /dev/null

if [ $? -eq 0 ]
    then
        echo "服务已在运行!"
    else
        echo "正在启动服务..."
        systemctl start 服务名
fi


chmod +x XXX.sh


bash XXX.sh
  • 多分支结构

  • 案例分数对应惩处
vim XXX.sh


read -p "请输入你的分数:" score

if [ $score -eq 100 ]
    then echo "..."
elif [ $score -ge 90 -a $score -lt 100 ]
    then echo "..."
elif [ $score -ge 70 -a $score -le 89 ]
    then echo "..."
else
    echo "..."
fi


chmod +x XXX.sh


bash XXX.sh

  • 案例判断数字是否为整数,是整数的话再判断为奇数还是偶数
vim XXX.sh


#!/bin/bash

read -p "请输入一个数字:" NUM

#整数%1为0,非整数则不为0
INT=$(echo "$NUM % 1" | bc)

#判断是否为整数
if [ "$INT" == "0" ];then
    echo "$NUM 为整数"
    #判断是否为0
    if [ $NUM -eq 0 ];then
    echo "0不是奇数也不是偶数"
    else
    a=$[NUM % 2]
    #判断除以2的余数是否为0,0为偶数,不为0为奇数
    if [ $a -eq 0 ];then
        echo "$NUM 为偶数"
    else
        echo "$NUM 为奇数"
    fi
    fi
else
    echo "${NUM}不为整数"
fi


chmod +x XXX.sh


bash XXX.sh

三、case语句结构

  • 案例分数对应惩处
vim XXX.sh


#!/bin/bash

read -p "请输入你的分数:" score
case $score in
100)
    echo "..."
    ;;
9[0-9])
    echo "..."
    ;;
[78][0-9])
    echo "..."
    ;;
[0-9]|[1-6][0-9])
    echo "..."
*)
    echo "..."
esac


chmod +x XXX.sh


bash XXX.sh

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

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

相关文章

FPGA学习笔记(1)——Vivado和HLS

1 Vivado设计 1.1 FPGA基本知识 Xilinx Atrix-7使用6输入LUT结构(0-63)CLB:可配置逻辑块Slice:每个CLB包含2个Slice(包含查找表LUT和8位寄存器REG)布线池:围绕在CLB周围,衔接FPGA的资源调度I/O块&#xf…

由北京车展想到的,技术红利时代的“重启”

北京车展刚刚落幕,雷军和周鸿祎成为网红,国产品牌站上王座。与此同时,马斯克“光速”访华,FSD酝酿入华再掀新竞争。华为在车展前发布的智驾新品牌“乾崑”,同样在现场广受关注。它们的精彩,让燃油车羡慕。 …

六西格玛备考攻略:无从下手?一文让你豁然开朗

当你决定备考六西格玛时,可能会感到有些无从下手。毕竟,这是一个涉及多个领域和方面的综合性考试,需要掌握的知识点和技能也非常广泛。但是,只要你有一个清晰的学习计划和一些有效的备考方法,就能够顺利地通过考试。以…

STM32F405 FOC 使用Timer 触发 ADC采集

STM32F405 FOC 使用Timer 触发 ADC 1. ADC采集模式2. 高级Timer模式3. ADC1 连续采集3.1 DMA软件触发3.2 DMATIM触发 4. ADC 注入模式采集5. 最终使用方法 1. ADC采集模式 根据STM32F405数据手册,可以看到ADC block diagram,ADC主要有两种触发模式&…

【VUE】el-descriptions 描述列表

Descriptions 描述列表 列表形式展示多个字段。 <el-descriptions title"用户信息"><el-descriptions-item label"用户名">kooriookami</el-descriptions-item><el-descriptions-item label"手机号">18100000000</e…

巨资回流,量子投资热潮再起

一股新的信心和资金浪潮正在席卷量子计算产业。 2023年4月30日&#xff0c;澳大利亚联邦政府和昆士兰州政府宣布共同出资9.4亿澳元&#xff08;约合6.2亿美元&#xff09;&#xff0c;支持美国初创企业PsiQuantum在布里斯班附近建设一台大型量子计算机。这项投资是最新的迹象之…

Linux中动态库的用法及优缺点?怎样制作动态库和静态库?

一、什么是gcc gcc的全称是GNU Compiler Collection&#xff0c;它是一个能够编译多种语言的编译器。最开始gcc是作为C语言的编译器&#xff08;GNU C Compiler&#xff09;&#xff0c;现在除了c语言&#xff0c;还支持C、java、Pascal等语言。gcc支持多种硬件平台. 在 Linux…

Leetcode—706. 设计哈希映射【简单】(constexpr)

2024每日刷题&#xff08;127&#xff09; Leetcode—706. 设计哈希映射 数组实现代码 class MyHashMap { public:MyHashMap() {memset(arr, -1, sizeof(arr));}void put(int key, int value) {arr[key] value;}int get(int key) {if(arr[key] -1) {return -1;} return arr…

可视化:智慧能源解决方案,降本增效,运筹帷幄。

智慧能源可视化解决方案是一种利用先进的技术和工具&#xff0c;将能源数据以直观、可视的方式呈现出来&#xff0c;帮助企业更好地管理能源使用&#xff0c;降低成本&#xff0c;提高效率的解决方案。 以下是一些智慧能源可视化解决方案可以帮助企业降本增效、智连未来的方式&…

【前端】实现快速改变内容大小选择框

简言 简单实现选择框改变内容大小和位置。 内容 这里实现选择框改变内容大小是让内容宽高等于选择框的百分之百&#xff0c;当选择框大小改变时&#xff0c;内容也会响应的改变。 位置则是根据定位实现的。 选择框 选择框就是一个div&#xff0c;然后定位上下左右四条边和…

FastText 算法原理及使用方法

文章目录 1. 前言2. 模型架构2.1 Hierarchical Softmax2.2 n-gram 特征 3. 训练及评估4. 使用5. 参考 1. 前言 FastText 是一个由 Facebook AI Research 在2016年开源的文本分类器&#xff0c;它的设计旨在保持高分类准确度的同时&#xff0c;显著提升训练和预测的速度。 论文…

https证书免费申请

https证书也称SSL证书或是TLS证书&#xff0c;主要是用于网站实现https加密访问。 1、工作原理&#xff1a;HTTPS证书在HTTP协议基础上加入了SSL/TLS协议层&#xff0c;实现数据的加密传输。当用户访问启用HTTPS的网站时&#xff0c;浏览器会与网站服务器建立一个安全连接。这个…

C++:继承-继承权限

在C中&#xff0c;类的权限分为公有、私有和保护三种。这些权限控制了类的成员&#xff08;数据成员和成员函数&#xff09;对外部代码的可见性和访问性。 公有&#xff08;public&#xff09;权限&#xff1a; 在公有权限下声明的成员可以被类的外部代码直接访问&#xff1b;公…

STM32、GD32驱动PCA9685控制舵机源码分享

一、PCA9685介绍 PCA9685是一种16通道PWM&#xff08;脉宽调制&#xff09;控制器芯片&#xff0c;由NXP Semiconductors公司生产。它具有高速I2C总线接口&#xff0c;可以通过I2C总线与微控制器或其他设备进行通信。PCA9685广泛应用于各种需要精确控制多路PWM信号的应用&…

一种利用MPLS实现IPv4网络向IPv6网络过度的技术

前言 6PE&#xff08;IPv6 Provider Edge&#xff09;是一种利用MPLS&#xff08;(Multi-Protocol Label Switching&#xff09;&#xff0c;实现IPv4网络向IPv6网络过渡的技术。6PE技术能够使得多个IPv6孤岛网络采用MPLS LSP隧道&#xff0c;跨越IPv4 MPLS骨干网相互进行通信…

碳课堂|如何开展碳排放核算? ISO 14064-2 项目层次要点解读

为提高企业组织碳排放报告信誉度&#xff0c;国际标准化组织&#xff08;ISO&#xff09;发布了ISO14064标准&#xff0c;其中《ISO 14064-2 项目层次上对温室气体减排和清除增加的量化、监测和报告的规范及指南》提供了项目策划阶段的原则要求&#xff0c;以及项目实施阶段的量…

VBA中类的解读及应用第十二讲:限制复选选择(上)

《VBA中类的解读及应用》教程【10165646】是我推出的第五套教程&#xff0c;目前已经是第一版修订了。这套教程定位于最高级&#xff0c;是学完初级&#xff0c;中级后的教程。 类&#xff0c;是非常抽象的&#xff0c;更具研究的价值。随着我们学习、应用VBA的深入&#xff0…

Mybatis Plus二级缓存 使用@CacheNamespace 失效@CacheNamespace和@CacheNamespaceRef

1、注解 CacheNamespace(flushInterval 100000,eviction LruCache.class,readWrite false,size 1024)2、xml配置 <cache eviction "LRU" flushInterval "100000" readOnly "true" size "1024"/> 二级缓存&#xff0c;配置文…

基础设施即代码——灵活构建具备弹性和可扩展性的基础设施

本书的初衷是帮助大家更好地编写基础设施即代码(Infrastructure as Code&#xff0c;IaC)&#xff0c;并且能够在不影响关键业务系统的情况下&#xff0c;稳定高效地变更基础设施资源。本书重点介绍了个人、团队或公司在基础设施系统中应用的模式与实践&#xff0c;聚焦能够应用…

【C++】——内存管理

&#x1f600;&#x1f600;前言 好久没更新了&#xff0c;五一小长假&#xff0c;有点玩脱了&#xff0c;今天赶紧补一篇博客&#xff0c;回回状态 一 c/c内存分配 下面看下面一段代码 #define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> using namespace std; i…