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

【Linux】Shell 脚本编程——条件测试与比较

ℹ️大家好,我是练小杰,周末愉快,好久不见,今天接着更新SHELL编程代码相关内容!!!


本文是 Linux shell 脚本编程中条件测试和比较方面内容,后续将添加更多相关知识噢,谢谢各位的支持🙏

前情回顾: 【Shell 命令从零开始】
Linux专栏:🔝 【Linux零基础开始】【Shell 脚本编程】 【Linux文件系统 】

主页:👉【练小杰的CSDN】

“我们的未来,由我们自己说了算~~”

在这里插入图片描述

    • 主页:👉【[练小杰的CSDN](https://blog.csdn.net/weixin_55767624?spm=1011.2415.3001.5343)】
    • “我们的未来,由我们自己说了算~~”
  • shell脚本的条件测试
    • test <测试表达式>
    • [ ](中括号)条件测试语法
  • 文件测试表达式
    • 测试选项详解
  • 字符串测试表达式
    • 判断字符串是否相等
  • 整数二元比较操作符
  • 逻辑操作符
    • 逻辑与: -a (&&)
    • 逻辑或:-o (||)
    • 逻辑非:!

在这里插入图片描述

shell脚本的条件测试

  • 条件测试常用的语法:

语法1:test <测试表达式>
语法2: [ <测试表达式> ]
语法3:[[ <测试表达式> ]]
语法4:(( <测试表达式>))


⚠️语法1中的test命令和语法2中的[ ]是一样的。语法3中的[[]]是扩展test命令,语法4中的(())常用于计算,我一般使用的是语法2,更方便。

test <测试表达式>

  • 利用test命令进行条件测试表达的方法,test命令和“<测试表达式>”之间至少有一个空格
  • 关于test测试表达式的更多使用选项,执行man test查看帮助文档。
  • test命令测试功能强大,但是和[ ]、[[ ]]的功能有所重合,因此,在实际工作中选择一种自己喜欢的语法就好。

在这里插入图片描述

  • 判断该文件是否存在于当前目录
[root@localhost lxj]# ls
lian.sh  lxj.sh
[root@localhost lxj]# test -f lian.sh  &&  echo "true" || echo "false"  // 输出结果ture

在这里插入图片描述

如果lian.sh文件存在,则输出true,否则(||)输出false。这里的&&表示并且的意思。-f参数用于测试文件是否为普通文件,test命令若执行成功(为真),则执行&&后面的命令,而||后面的命令则是test命令执行失败之后(为假)所执行的命令。

  • 判断文件是否有可执行权限x
echo $(test -x /root/lxj/lian.sh )echo $( test -x /root/lxj/lian.sh && echo "ture" || echo "false") 
//输出结果为false

在这里插入图片描述

第一条命令只使用test 命令是没有输出结果的, test -x 命令在执行时只返回退出状态码。但是$()命令是有标准输出的,不是退出状态码。
因此,在test 命令后加上 echo "ture" || echo "false" 用于判断文件权限。

[ ](中括号)条件测试语法

⚠️ 中括号内部的两端要有空格[ ]test等价,即test的所有判断选项都可直接在[ ]里使用。

  • 基础语法格式为:
[ <测试表达式> ]
  • 判断该文件是否存在于当前目录,另一种写法[ -f lian.sh ])
[root@localhost lxj]# [ -f lian.sh ]  &&  echo "true" || echo "false"
true
[root@localhost lxj]# ls
lian.sh  lxj.sh

在这里插入图片描述

  • 判断该文件是否是目录
[root@localhost lxj]# [ -d lian.sh ]  &&  echo "true" || echo "false"
false
[root@localhost lxj]# ll
总用量 8
-rw-r--r--. 1 root root 57 6月  11 16:13 lian.sh
-rw-r--r--  1 root root 41 6月  25 09:41 lxj.sh

在这里插入图片描述

可以看到文件lian.sh 是普通文件,不是目录文件,返回输出结果false

文件测试表达式

shell编程中要处理一个对象,一般是先对对象进行测试,只有在确定它符合要求时,才应进行操作处理,这样做的好处就是避免程序出错及无谓的系统资源消耗,这个需要测试的对象可以是文件、字符串、数字等。

  • 判断文件/root/lxj 是否是目录文件
[root@localhost ~]# test -d /root/lxj   &&  echo "true" || echo "false"
true
[root@localhost ~]# [ -d /root/lxj ]  &&  echo "true" || echo "false"
true

在这里插入图片描述

通过输出结果,可以发现,lxj是目录/root 下的一个目录文件,权限为drwxr-xr-x.

测试选项详解

- b<文件> block:如果文件为一个块特殊文件,则为真;
-c<文件> character:如果文件为一个字符特殊文件,则为真;
-S<文件> socker:如果文件为一个套接字特殊文件,则为真;
-p<文件> pipeline:如果文件为一个命名管道,则为真;
-f<文件> file:如果文件为一个普通文件,则为真;
-d<文件> directory:如果文件为一个目录,则为真;
-e<文件> exist:如果文件存在,则为真;
-G<文件> group:如果文件存在且归该组所有,则为真;
-O<文件> own:如果文件存在并且归该用户所有,则为真;
-g<文件> SGID:如果设置了文件的SGID位,则为真;
-u<文件> SUID:如果设置了文件的SUID位,则为真;
-k<文件> Sticky bit:如果设置了文件的粘着位,则为真;
-r<文件> read:如果文件可读,则为真;
-w<文件> write:如果文件可写,则为真;
-x<文件> execute:如果文件可执行,则为真。
-s<文件> size:如果文件的长度不为零,则为真;

字符串测试表达式

字符串测试操作符的作用包括:比较两个字符串是否相同、测试字符串的长度是否为0、字符串是否为NULL等。

在这里插入图片描述

判断字符串是否相等

[root@localhost ~]# str1="I like lxj"
[root@localhost ~]# str2="I hate lian"
[root@localhost ~]# test str1 == str2  && echo "true" || echo "false"
false
[root@localhost ~]# [ str1 == str2 ] && echo "true" || echo "false"
false

在这里插入图片描述

⚠️ 注意:中括号内的[ ] 判断符号== 前后必须要用空格隔开,否则会出现错误❎判断。

  • 例如,下面的==前后没有空格,导致字符串判断结果错误。
[root@localhost ~]# test str1==str2  && echo "true" || echo "false"
true

在这里插入图片描述

整数二元比较操作符

在这里插入图片描述

  • =”和“!=”也可在[ ] 做比较使用,但在[ ]中使用包含“>”和“<”的符号时,需要用反斜杠“\”进行转义,有时不转义虽然语法不会报错,但是结果可能会不对。
  • 也可以在[[ ]]中使用包含“-gt”和“-lt”的符号,但是不建议这样使用。
  • 比较符号两端也要有空格。
  • 判断数的大小
[root@localhost ~]#  [ 12 -gt 8 ]  && echo "true" || echo "false"
true

在这里插入图片描述

逻辑操作符

在这里插入图片描述

逻辑与: -a (&&)

格式:表达式1 -a 表达式2
结果:表达式1 和表达式2 都为真,才返回真,否则返回假。

  • 判断文件有可执行权限且是目录文件,都为真返回1,否则返回0
[root@localhost ~]#  [ -x /root/lxj -a -d /root/lxj ]  && echo "1" || echo "0"
1
[root@localhost ~]# ll
总用量 8
-rw-------. 1 root root 1684 6月  11 15:35 anaconda-ks.cfg
-rw-r--r--. 1 root root 1715 6月  11 15:39 initial-setup-ks.cfg
drwxr-xr-x. 2 root root   35 6月  25 09:41 lxj

在这里插入图片描述

/root/lxj 是可执行且是文件, 结果返回1

逻辑或:-o (||)

格式:表达式1 -o 表达式2
结果:表达式1 和 表达式2中,有一个条件为真,即返回真,否则返回假。

  • 判断文件 是可执行或者 文件是目录文件时, 返回1,否则返回0
[root@localhost ~]#  [ -x /root/lxj -o -d /root/lxj ]  && echo "1" || echo "0"
1
[root@localhost ~]#  [ -x /root/lxj -a -d /root/lxj ]  && echo "1" || echo "0"
1

在这里插入图片描述

  • 利用|| 表示或运算符时,要用[[ ]] 或者 (( )) ,否则会报错
[root@localhost ~]#  [ -x /root/lxj || -d /root/lxj ]  && echo "1" || echo "0"
bash: [: 缺少 `]'
bash: -d: 未找到命令...
0[root@localhost ~]#  [[  -x /root/lxj || -d /root/lxj ]]  && echo "1" || echo "0"
1

在这里插入图片描述

逻辑非:!

格式:!条件语句
结果:返回条件测试条件结果的相反值

  • 判断测试语句的相反数值
[root@localhost ~]# ! [[ -x /root/lxj ]]  && echo "1" || echo "0"
0

在这里插入图片描述

⚠️ !与中括号之间要有空格,否则命令报错


在这里插入图片描述

今天的SHELL 脚本的相关内容到这里就结束了,下次再见啦👋
ℹ️了解更多,主页【练小杰的CSDN】

⚠️若博客里的内容有问题,欢迎指正,我会及时修改!!! 下周同一时间再见,各位伙伴们🚴🏻‍♀️~~

http://www.lryc.cn/news/575052.html

相关文章:

  • python的易家宜超市云购物系统
  • 无人机灯光驱动模块技术解析
  • 京东正式开源 Taro on HarmonyOS C-API 版本,为鸿蒙应用跨端开发提供高性能框架
  • Xcode缓存清除
  • 【CUDA调优指南】缓存访存流程
  • Jenkins CLI 使用方法介绍
  • Jenkins JNLP与SSH节点连接方式对比及连接断开问题解决方案
  • 力扣2040两个有序数组的第K小乘积
  • Docker、Docker composer与Docker desktop
  • 英文摘要给成中文摘要模型
  • 探索解析C++ STL中的 list:双向链表的高效实现与迭代器
  • NCCN Guidelines Navigator:数智化工具引领肿瘤精准治疗新纪元
  • 八股文——JAVA基础:说一下C++与java的区别
  • 企业内部安全组网技术解析:安全通道选型、零信任架构与数据合规加密防护
  • 【AI论文】拖拽式大型语言模型:零样本提示到权重的生成
  • 打造灵活强大的PDF解析管道:从文本提取到智能分块的全流程实战
  • 从零构建 gRPC 跨语言通信:C++ 服务端与 C# 客户端完整指南
  • 数据库1.0
  • OceanBase向量检索在货拉拉的探索和实践
  • 【智能协同云图库】智能协同云图库第二弹:用户管理系统后端设计与接口开发
  • Mysql使用窗口函数查询
  • 基于MATLAB的BP神经网络的心电图分类方法应用
  • 云原生与人工智能的融合:从弹性架构到智能运维的IT新范式
  • Notepad++ 漏洞可致攻击者获取系统完全控制权
  • 第⼀个与⼤模型交互的应⽤
  • 快手视频怎么下载?详细教程与方法解析
  • 一步部署APache编译安装脚本
  • 写入P99延迟突破1秒含义
  • 資訊安全 (Information Security)3大 “CIA“要素
  • 【启发式算法】RRT*算法详细介绍(Python)