shell脚本的条件判断1:字符串和数字和比较

news2025/7/20 5:56:33

前言 

写脚本时,为了让脚本更接近人类思考问题的方式,可以对各种情况进行判断。例如,经常需要判断某些条件是否成立,如果条件成立该如何处理,如果条件不成立又该如何处理,这些都可以通过Shell脚本的if语句结合各种条件判断来实现。

一 智能化脚本的基础之测试 

在Shell中可以使用多种方式进行条件判断,如[[表达式]]、[表达式]或者test表达式。使用条件表达式可以测试文件属性,进行字符或数字的比较。需要注意的是,不管使用哪种方式进行条件判断,系统默认都不会有任何输出结果,可以通过echo $?命令,查看上一条命令的退出状态码,或者使用&&和||操作符结合其他命令进行结果的输出操作。

注意 

表达式两边必须有空格,否则程序会出错。使用[[]]和test进行排序比较时,使用的比较符号不同。在test或[]中不能直接使用<或>符号进行排序比较。

如果需要在一行代码中输入多条命令,在Shell中可以使用;(分号)、&&(与)、||(或)这三个符号将多个命令分隔。其中;(分号)是按顺序执行命令,分号前后的命令可以没有任何逻辑关系。例如,输入“A命令;B命令”,系统会先执行A命令,不管A命令执行结果如何,都会执行B命令。整个命令的退出码以最后一条命令为准,B命令如果执行成功则退出码为0, B命令如果执行失败则退出码为非0。而使用&&(与)符号分隔多条命令时,仅当前一条命令执行成功后,才会执行&&后面的命令。例如,输入“A命令&&B命令”,系统会先执行A命令,如果A命令执行成功则执行B命令,如果A命令执行失败则不执行B命令。而整行命令的退出码取决于两条命令是否同时执行成功,如果A命令执行成功并且B命令执行也成功,则整行命令的退出码为0,而A命令或B命令中的任何一条命令执行失败,则整行命令的退出码为非0。如果使用||(或)符号分隔多条命令,仅当前一条命令不执行或执行失败后才执行后一条命令。例如,输入“A命令||B命令”,因为A命令是命令行的第一条命令,所以一定会执行,如果A命令执行成功了就不再执行B命令,如果A命令执行失败,则执行B命令, 所以一定会执行,如果A命令执行成功了就不再执行B命令,如果A命令执行失败,则执行B命令,A命令和B命令为二选一的关系。A命令或B命令中有任何一条命令的退出码为0,则整行命令的退出码就是0,否则返回非0。

二 实例验证 

||(或符号)和&&验证:目录中没有hehe文件,所以ls hehe执行时,为假,不执行&& cat hehe,执行||后面的输出

csdn@ubuntu:~$ [ $(ls hehe) ] && cat hehe || (echo $?;echo "no file hehe";)
ls: 无法访问'hehe': 没有那个文件或目录
1
no file hehe
csdn@ubuntu:~$

有main.c文件,所以,判断main.c时,执行了&&后面的语句cat main.c。因为||前面的值已经为真,所以不执行||后面的语句。

csdn@ubuntu:~$ [ $(ls main.c) ] && (echo $?;cat main.c) || echo "no file main.c"
0
#include <stdio.h>


int main(void)
{
        printf("hello world\n");

        return 0;
}

csdn@ubuntu:~$

三 字符串的判断与比较

下面的表达式使用test或[]测试的效果是一样,表达式中可以使用变量。使用$?查看上一条命令的退出码,0代表正确(true),非0代表错误(false)。

csdn@ubuntu:~$ test a == a;echo $?
0
csdn@ubuntu:~$ [ a == a ];echo $?
0

csdn@ubuntu:~$ test a == b;echo $?
1
csdn@ubuntu:~$ [ a == b ];echo $?
1
csdn@ubuntu:~$

 下面的测试,因为当前用户是csdn,测试结果为假,所以跳过echo Y命令,执行echo N,结果屏幕仅显示N。

csdn@ubuntu:~$ [ $USER == root ] && echo Y || echo N
N
csdn@ubuntu:~$

 切换用户到root,切换用户后,当前用户变成root,测试结果为真,所以会执行echo Y命令,而当echo Y命令执行并成功后,则不再执行echo N,结果屏幕仅显示Y。

csdn@ubuntu:~$ su
密码:
root@ubuntu:/home/csdn# [ $USER == root ] && echo Y || echo N
Y
root@ubuntu:/home/csdn#

在表达式中使用-z可以测试一个字符串是否为空,下面测试一个未定义的变量TEST,如果变量值为空则屏幕显示Y,否则显示N。 定义变量TEST后,输出N。使用unset释放变量后,输出值变为Y。

root@ubuntu:/home/csdn# [ -z $TEST ] && echo Y || echo N
Y
root@ubuntu:/home/csdn# TEST=123456
root@ubuntu:/home/csdn# [ -z $TEST ] && echo Y || echo N
N
root@ubuntu:/home/csdn# unset TEST
root@ubuntu:/home/csdn# [ -z $TEST ] && echo Y || echo N
Y
root@ubuntu:/home/csdn#

 在Shell中进行条件测试时一定要注意空格问题。使用[]测试时,左方括号右边和右方括号左边都必须有空格。而且测试的比较符号两边也必须都有空格。

我们还可以使用-n测试一个字符串是否非空(变量值不为空)。但是在实际应用时最好将测试对象使用双引号引起来。 

root@ubuntu:/home/csdn# TEST=123456
root@ubuntu:/home/csdn# [ -n $TEST ] && echo Y || echo N
Y
root@ubuntu:/home/csdn#

 这样看起来没什么问题。但是,当测试一个未定义的变量时就会出故障。下面测试一个未定义的变量hello是否非空。为什么hello的度量值明明为空,但测试却说该变量值不为空呢?

root@ubuntu:/home/csdn# [ -n $hello ] && echo Y || echo N
Y
root@ubuntu:/home/csdn# echo $hello

root@ubuntu:/home/csdn#

 因为,当$hello为空时,等同于执行了下面的第一条命令,是在测试一个空格是否为空值。而计算机理解空格也是有值的,并非没有值(空值),所以这样的测试结果总为真;但程序的逻辑其实已经出错了。为了防止类似这种错误,可以将变量使用双引号(单引号会屏蔽特殊字符,会将$变成一个普通字符,所以这里不能使用单引号)引起来。

root@ubuntu:/home/csdn# [ -n ] && echo Y || echo N
Y
root@ubuntu:/home/csdn# [ -n "$hello" ] && echo Y || echo N
N
root@ubuntu:/home/csdn#

 四 整数的判断与比较

比较两个数字可能的结果有等于、不等于、大于、大于或等于、小于、小于或等于这么几种情况,在Shell脚本中支持对整数的比较判断,可以使用下表所示的符号进行比较运算。

root@ubuntu:/home/csdn# test 3 -eq 3 && echo Y || echo N
Y
root@ubuntu:/home/csdn# test 3 -ne 3 && echo Y || echo N
N
root@ubuntu:/home/csdn# test 3 -gt 3 && echo Y || echo N
N
root@ubuntu:/home/csdn# test 3 -ge 3 && echo Y || echo N
Y
root@ubuntu:/home/csdn# test 3 -lt 3 && echo Y || echo N
N
root@ubuntu:/home/csdn# test 3 -le 3 && echo Y || echo N
Y
root@ubuntu:/home/csdn#

综合案例 

案例1:判断系统可用内存是否大于400MB

 下面这个案例使用grep命令结合正则表达式,从meminfo文件中过滤当前系统剩余可用的内存容量,剩余容量以KiB为单位,最后测试剩余可用容量是否小于或等于400MiB。

root@host:~# cat /proc/meminfo | grep Available
MemAvailable:     432424 kB
root@host:~#

grep命令使用-o选项可以仅显示匹配内容,而不显示全行所有内容。 

root@host:~# cat /proc/meminfo | grep Available | egrep -o "[0-9]+"
432348
root@host:~#

 或者grep -E

root@host:~# cat /proc/meminfo | grep Available | grep -Eo "[0-9]+"
432408
root@host:~#
root@host:~# mem_free=$(grep Available /proc/meminfo | grep -Eo [0-9]+);echo $mem_free
432400
root@host:~#

判断小于400MB,输出N

root@host:~# [ $mem_free -le 409600 ] &&echo Y || echo N
N
root@host:~#

判断大于 400BM,输出Y

root@host:~# [ $mem_free -gt 409600 ] &&echo Y || echo N
Y
root@host:~#

案例2:判断进程数量 

接下来使用ps命令,查看系统中所有启动的进程列表信息,结合wc命令还可以统计当前系统中已经启动的进程数量。这样,就可以判断是否启动了超过60个进程。 

root@host:~# ps aux | wc -l
57
root@host:~# proc_num=$(ps aux | wc -l);echo $proc_num
58
root@host:~# [ $proc_num -gt 60 ] && echo Y || echo N
N
root@host:~#

 案例3:判断账户数量

使用wc命令统计/etc/passwd文件的行数(有多少行就表示系统中有多少个账户),判断当前系统账户数量是否大于或等于30个。

root@host:~# cat /etc/passwd | wc -l
9
root@host:~# user_num=$(cat /etc/passwd | wc -l);[ $user_num -ge 30 ] && echo Y || echo N
N
root@host:~#

小结

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

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

相关文章

大数据_什么是数据中台?

目录 一、数据中台的定义 二、数据中台必备的是个核心能力 三、数据中台VS业务中台 四、数据中台VS数据仓库 五、数据中台VS现有信息架构 六、数据中台的业务价值与技术价值 一、数据中台的定义 数据中台是一套可持续“让企业的数据用起来”的机制&#xff0c;是一种战略…

vm的生命周期钩子

vm的生命周期钩子&#xff08;共11个&#xff09;&#xff1a; 前8个&#xff1a; 将要创建>调用beforeCreate函数 创建完毕>调用created函数 将要挂载>调用beforeMount函数 &#xff08;重要&#xff09;挂载完毕>调用mounted函数>【重要钩子】 将要更新…

用户画像洞察分类模型 - 前端页面展示

文章目录一、前端与数据智能二、 体验优化需求场景跳失预测交互偏好智能 UI三、 关键技术鲸幂 UICook&#xff08;智能UI&#xff09;DataCookPipCookPipeline四、 体验优化实践数据智能实践的一般流程数据采集数据分析 -如何对数据进行分析处理并得出结论数据应用 - 分析结论如…

【C++】string类接口的了解和使用

为什么我们要学string类呢&#xff1f;那是必须是为了方便啊&#xff01;在C语言中&#xff0c;我们创建一个字符串&#xff0c;有很多操作或者必须要注意的细节会把控不住&#xff0c;所以C中出现了string类&#xff0c;让我们应对字符串等oj题也方便快捷了许多&#xff01; 目…

linux搭建redis数据库实现远程c语言访问

文章目录 linux安装reidis数据库c语言使用hiredis库实现redis数据库的操作测试代码使用hiredis库制作一个redis数据库管理系统linux安装reidis数据库 linux安装reidis数据库 sudo apt-get install redis-server使用systemctl命令查看redis服务运行状态 sudo systemctl statu…

Visual C++ 2010开发的程序在其它电脑上运行提示“找不到MSVCR100D.dll”原因及解决

Visual C 2010开发的程序在其它电脑上运行提示“找不到MSVCR100D.dll”原因及解决 Microsoft Visual C&#xff08;简称Visual C、MSVC、VS或VC&#xff09;2010是微软公司的免费C开发工具&#xff0c;具有集成开发环境&#xff0c;可提供编辑C语言&#xff0c;C以及C/CLI等编程…

惊喜:2023前瞻版Java面试指南,不止八股文

前言&#xff1a; 2022年马上就要过去了&#xff0c;即将要到来的就是2023年的金三银四面试季&#xff0c;随着政策的放宽&#xff0c;经济的逐步复苏&#xff0c;岗位的需求也会越来越大&#xff0c;所以趁这段时间进行知识储备将会是最好的时间段&#xff0c;永远要做快人一…

卷积神经网络——李宏毅机器学习笔记

以Image Classification为例 第一个解释角度&#xff1a; 先将不同尺寸的image&#xff0c;rescale成大小一样的尺寸&#xff0c;再丢到model中。 下图中&#xff0c;我们希望Cross entropy 越小越好 在计算机视角下的图片&#xff1a; 3 channels 对应R G B三个通道 随着模…

VirtualBox安装openEuler方案一

下载&#xff1a; https://www.openeuler.org/zh/mirror/list/ 根据设备架构选择对应的版本&#xff1a;windows是x86架构 选择下面这个4.2G大小的&#xff1a; 安装&#xff1a; 安装部分建议参考另一篇文章&#xff1a;virtualbox安装openEuler-方案二 下面部分的安装…

Flink CDC 2.3 发布,持续优化性能,更多连接器支持增量快照,新增 Db2 支持

01Flink CDC 简介Flink CDC [1] 是基于数据库的日志 CDC 技术&#xff0c;实现了全增量一体化读取的数据集成框架。配合 Flink 优秀的管道能力和丰富的上下游生态&#xff0c;Flink CDC 可以高效实现海量数据的实时集成。作为新一代的实时数据集成框架&#xff0c;Flink CDC 具…

电子班牌解决方案-最新全套文件

电子班牌解决方案-最新全套文件一、建设背景二、建设思路三、建设方案四、获取 - 电子班牌全套最新解决方案合集一、建设背景 信息技术已渗透到经济发展和社会生活的各个方面&#xff0c;人们普遍关注教育信息化在提高国民素质和增强国家创新能力方面的重要作用。 《国家中长…

分块查找 确定查找位置

此时 当low和high指在某个相同的位置mid时&#xff08;此时low,mid,high指向同一位置&#xff09;&#xff0c;mid的左边元素小于19&#xff0c;因为low左边的元素一定小于19&#xff0c;mid右边的元素大于19&#xff0c;因为high右边的元素大于19。我们需要寻找的是位置是大于…

PMI新人才三角如何构建自己的影响力?【洞见1】

背景&#xff1a; VUCA时代&#xff0c;Volatility&#xff08;易变性&#xff09;&#xff0c;Uncertainty&#xff08;不确定性&#xff09;&#xff0c;Complexity&#xff08;复杂性&#xff09;&#xff0c;Ambiguity&#xff08;模糊性&#xff09;&#xff0c;这个时代…

c++new和delete的匹配问题与raii的定制删除器

目录 1.关于new与delete 2.智能指针的定制删除器 1.关于new与delete 这里我想介绍的是new[]与delete[]没有配套使用带来的影响。这个是否发生错误和使用的ide有很大的关系。&#xff08;这里我用vs平台做示例&#xff09; 如果对内置类型采用new[]来开辟开辟空间&#xff0c…

postgresql源码学习(50)—— 小白学习Dtrace追踪源码函数调用

不知不觉第50篇了&#xff0c;昨天在文章里&#xff08;https://mp.weixin.qq.com/s/AzBGzYhGxYjSf7Sptj55lQ&#xff09;学到一个追踪源码执行情况的利器 —— Dtrace&#xff0c;本篇记录下实验和笔记。 一、 解决痛点 学习以来一直有一个疑惑&#xff0c;如何将pg中执行的SQ…

Spring Boot 3.0 正式发布,这份升级指南必须收藏

Spring Boot 3.0 现已正式发布&#xff0c;它包含了 12 个月以来 151 个开发者的 5700 多次代码提交。这是自 4.5 年前发布 2.0 以来&#xff0c;Spring Boot 的第一次重大修订。它也是第一个支持 Spring Framework 6.0 和 GraalVM 的 Spring Boot GA 版本&#xff0c;同时也是…

Nginx环境搭建及前端部署教程(Windows版)

1、Nginx简介 Nginx (engine x) 是一个轻量级、高性能的HTTP和反向代理web服务器&#xff0c;同时也提供了IMAP/POP3/SMTP服务。几乎可以做到 7 * 24 小时不间断运行&#xff0c;即使运行几个月也不需要重新启动&#xff0c;还能在不间断服务的情况下对软件版本进行热更新。性…

2022年,数字化转型升级,越来越重要

所谓数字化营销&#xff0c;指的是使用数字传播渠道推广产品和服务&#xff0c;从而以一种及时、相关、定制化和节省成本的方式与消费者进行沟通。 进入2022年&#xff0c;数字化转型升级&#xff0c;变得越来越重要。 01政策推动数字化发展 国家“十四五”期间将加快推进企业…

arthas进阶版排查问题之idea插件工具操作

arthas前面的文章讲了怎么去使用命令排查线上问题&#xff0c;线上出了问题就需要我们去排查问题和处理程序异常&#xff0c;但是线上一般出问题不太好解决&#xff0c;总有一些奇怪的问题&#xff0c;当然很多场景是测试测试不到的&#xff0c;我们不能百分百保证线上不出问题…

Unreal地形高级材质之根据斜率分配材质

目的&#xff1a;根据地形的斜率来混合地形材质&#xff0c;制作地形时&#xff0c;当地形有高度抬升时&#xff0c;被拉伸部位的贴图会出现拉伸&#xff0c;或者想要在拉伸区域使用其他类型种类的贴图时。如果使用笔刷对地形进行更改是耗费时间的&#xff0c;所以想要整体一次…