Linux Shell 比较运算有哪些,以及怎么用

Linux Shell 比较运算有哪些,以及怎么用

在 Linux Shell 脚本编程中,进行算术比较是常见的需求,特别是在编写条件判断语句时。Shell 提供了一系列的算术比较操作符,这些操作符通常用在 ifwhile 等语句中,以便进行数值比较。下面介绍一些常用的算术比较操作符和它们的用法。

算术比较操作符

  • -eq:等于。如果两个数相等,则返回 true。
    • 用法示例:if [ $a -eq $b ]
  • -ne:不等于。如果两个数不相等,则返回 true。
    • 用法示例:if [ $a -ne $b ]
  • -gt:大于。如果左边的数大于右边的数,则返回 true。
    • 用法示例:if [ $a -gt $b ]
  • -ge:大于等于。如果左边的数大于或等于右边的数,则返回 true。
    • 用法示例:if [ $a -ge $b ]
  • -lt:小于。如果左边的数小于右边的数,则返回 true。
    • 用法示例:if [ $a -lt $b ]
  • -le:小于等于。如果左边的数小于或等于右边的数,则返回 true。
    • 用法示例:if [ $a -le $b ]

示例 1:比较两个数的大小

#!/bin/basha=10
b=20if [ $a -lt $b ]; thenecho "$a 小于 $b"
elif [ $a -gt $b ]; thenecho "$a 大于 $b"
elseecho "$a 等于 $b"
fi

这个脚本会输出 “10 小于 20”,因为在这个例子中,a 的确是小于 b 的。

示例 2:检查数值是否相等

#!/bin/bashnum1=100
num2=100if [ $num1 -eq $num2 ]; thenecho "两个数相等"
elseecho "两个数不相等"
fi

这个脚本会输出 “两个数相等”,因为 num1num2 的值都是 100。

示例 3:每个算术比较操作符的具体用法如下:

  • 等于 (-eq)

    if [ $a -eq $b ]; thenecho "$a 等于 $b"
    fi
    
  • 不等于 (-ne)

    if [ $a -ne $b ]; thenecho "$a 不等于 $b"
    fi
    
  • 大于 (-gt)

    if [ $a -gt $b ]; thenecho "$a 大于 $b"
    fi
    
  • 大于等于 (-ge)

    if [ $a -ge $b ]; thenecho "$a 大于等于 $b"
    fi
    
  • 小于 (-lt)

    if [ $a -lt $b ]; thenecho "$a 小于 $b"
    fi
    
  • 小于等于 (-le)

    if [ $a -le $b ]; thenecho "$a 小于等于 $b"
    fi
    

小技巧

  • 使用算术比较操作符时,确保比较的变量值是数字。
  • 如果需要进行复杂的数学计算,可以使用 expr 命令或者双括号 ((...)) 来执行。

逻辑运算符

-o(逻辑或)和 -a(逻辑与)这两个在 Shell 脚本中用于控制流的逻辑操作符。这些操作符允许我们在同一个条件语句中结合多个条件判断,为脚本的逻辑控制提供了更大的灵活性。

-o 逻辑或(OR)

当给定的两个条件中至少一个条件为 true 时,-o 操作符会返回 true。这在需要满足多个条件之一的情况下非常有用。

  • 用法示例:检查两个变量中至少一个等于给定值的情况。
    if [ $a -eq 5 -o $b -eq 10 ]; thenecho "至少一个条件满足"
    fi
    

-a 逻辑与(AND)

只有当给定的所有条件都为 true 时,-a 操作符才会返回 true。这适用于需要同时满足多个条件的情况。

  • 用法示例:同时检查两个变量是否分别等于特定的值。
    if [ $a -eq 5 -a $b -eq 10 ]; thenecho "两个条件均满足"
    fi
    

逻辑操作符示例

下面的示例展示了如何使用 -a-o 逻辑操作符来组合多个条件。

#!/bin/bash# 设置变量
a=1
b=2# 使用 -a 操作符
if [ $a -eq 1 -a $b -eq 2 ]; thenecho "两个条件均满足"
fi# 使用 -o 操作符
if [ $a -eq 1 -o $b -eq 3 ]; thenecho "至少一个条件满足"
fi

在这个示例中,第一个 if 语句使用 -a 操作符来检查 $a 是否等于 1 且 $b 是否等于 2。第二个 if 语句使用 -o 操作符来检查 $a 是否等于 1 或 $b 是否等于 3。根据这些条件,相应的消息将被输出到控制台。

文件系统比较运算符

  • [ -e $var ]:检查文件是否存在。如果文件(或目录)存在,则条件为真。
    • 用法示例:if [ -e $filename ]; then echo "文件存在"; fi
  • [ -r $var ]:检查文件是否存在且可读。如果文件存在且对当前用户或脚本可读,则条件为真。
    • 用法示例:if [ -r $filename ]; then echo "文件可读"; fi
  • [ -w $var ]:检查文件是否存在且可写。如果文件存在且对当前用户或脚本可写,则条件为真。
    • 用法示例:if [ -w $filename ]; then echo "文件可写"; fi
  • [ -x $var ]:检查文件是否存在且可执行。如果文件存在且对当前用户或脚本可执行,则条件为真。
    • 用法示例:if [ -x $filename ]; then echo "文件可执行"; fi
  • [ -s $var ]:检查文件是否存在且其大小大于零。如果文件存在且其大小大于零,则条件为真。
    • 用法示例:if [ -s $filename ]; then echo "文件非空"; fi
  • [ -d $var ]:检查文件(指定路径)是否存在且为一个目录。如果所指定的文件存在且为一个目录,则条件为真。
    • 用法示例:if [ -d $dirname ]; then echo "目录存在"; fi

字符串比较

使用字符串进行比较时,最好用双中括号,因为有时候采用单个中括号会产生错误,所以最好避开它们。

在 Shell 脚本中,字符串比较是处理文本数据的重要方面。下面是对前面提到的字符串比较运算符的详细说明。

  • [[ $str1 = $str2 ]][[ $str1 == $str2 ]]:检查两个字符串是否相等。如果相等,则条件为真。
    • 用法示例:if [[ $str1 == $str2 ]]; then echo "字符串相等"; fi
  • [[ -z $str1 ]]:检查字符串变量 $str1 是否为空(长度为零)。如果为空,则条件为真。
    • 用法示例:if [[ -z $str1 ]]; then echo "字符串为空"; fi
  • [[ -n $str1 ]]:检查字符串变量 $str1 是否非空(长度大于零)。如果非空,则条件为真。
    • 用法示例:if [[ -n $str1 ]]; then echo "字符串非空"; fi
  • [[ $str1 = s*a ]]:检查字符串 $str1 是否匹配模式 s*a,其中 * 表示任意数量的任意字符。如果匹配,则条件为真。
    • 用法示例:if [[ $str1 = s*a ]]; then echo "字符串匹配"; fi

可以用test命令执行条件检测,有助于避免使用过多括号

virde@virde:~$ str1=""
virde@virde:~$ test -z $str1 && echo "str1 is empty"
str1 is empty
virde@virde:~$ [[ -z $str1 ]] && echo "str1 is empty"
str1 is empty
virde@virde:~$ 

参考链接

  • Bash Scripting Guide:https://www.gnu.org/software/bash/manual/bash.html
  • Advanced Bash-Scripting Guide:http://tldp.org/LDP/abs/html/

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

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

相关文章

程序员如何搞副业?

程序员不仅拥有将抽象概念转化为实际应用的能力,还通常具备强大的逻辑思维和问题解决能力。然而,许多程序员并不满足于仅仅在一家公司工作,他们渴望通过副业来实现个人价值的最大化,增加收入,甚至探索自己的创业梦想。…

前端及nodejs后端面试经验

目录 前端双向绑定如何实现自定义指令如何实现promise的执行顺序父子组件的信息传递cookies,session,webStoragevuex回流和重绘指令watch和watchEffect的区别watch和computed的区别vue3新功能Composition APIproxy和definePropertyTeleport 请求post和pu…

RIP配置不求人:手把手教你配置RIP路由

#教育优质作者发文挑战赛# 大家好,今天给同学们介绍一下RIP基本功能相关配置 01、基本概念 RIP是一种基于距离矢量(Distance-Vector)算法的协议,它使用跳数(Hop Count)作为度量值来衡量到达目的地址的距离…

耐压40V、输出电压1.23-37V可调,适用于工控主板、TV板卡、安卓主板、车载功放电源等产品方案应用。

一、应用领域 适用于工控主板、TV板卡、安卓主板、车载功放电源等产品方案应用。 二、功能介绍 D1509是一款输入耐压40V、输出电压1.23-37V可调、输出电流最大2.0A的高效率、高精度DC-DC芯片,其输出电压有固定3.3V、5.0V和12.0V的版本,可以为客户省去…

【2024】Rancher的安装与介绍

———————————————————————————— 记录一下rancher的学习与使用过程 本部分内容包括rancher的介绍、特点、与k8s关系和部署等内容 ———————————————————————————— Rancher是什么? 简单来说,Ranc…

item_password获得淘口令真实urlAPI接口输入淘口令代码获取淘口令url

要获取淘口令真实url,首先需要注册一个Api Key和Api Secret。接下来,可以使用淘口令API接口来获取淘口令的真实url。 item_password-获得淘口令真实url 公共参数 名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)s…

BIDI的单芯双向光模块是在用哪里的?

为什么要选择BIDI光模块? BIDI光学模块最明显的优点,如SFP BIDI光学模块或SFP BIDI光学模块,可以减少光纤跳线面板上的端口数量,节省光纤布线基础设施的成本,减少布线空间,方便光纤的管理,减少…

什么是电子邮件加密?电子邮件加密有几种类型?

在当今数字时代,电子邮件已经成为人们日常生活中不可或缺的沟通工具,据相关数据统计,全球每天发送的电子邮件数以亿计,而这些邮件里面通常包含了姓名、地址、个人身份信息 (PII)、登录凭证、财务信息、法律合同、知识产权等有价值…

ssh: Could not resolve hostname xxx: Name or service not known

参考文章:https://blog.csdn.net/bewhyw/article/details/134452826 修改etc/hosts中的文件,加入所有主机的地址映射即可: vi /etc/hosts

每日一题:寻找两个正序数组的中位数(Olog(m+n))

给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 示例 1: 输入:nums1 [1,3], nums2 [2] 输出:2.00000 解释:合并数组 [1,2,3] &#xff0c…

1.Swift基础控件:TableView列表

Swift TalbeView列表的使用 一、简介 在 iOS 开发中,UITableView 是一个常用的界面组件,用于显示列表型数据。UITableView 可以展示大量数据,并支持滚动、分组、选择等功能,是开发 iOS 应用中常见的组件之一。 以下是 UITableV…

【LeetCode热题100】198. 打家劫舍(动态规划)

一.题目要求 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房…

AI智慧医疗:探索机器学习在医疗保健中的应用与进展

🧑 作者简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向的学习指导…

Physics-Informed Neural Networks (PINN)

传统的数值模拟方法通常基于有限元、有限差分或有限体积等技术,它们需要构建网格并对物理方程进行离散化处理。然而,这些方法在处理复杂的几何形状、边界条件变化或多物理场耦合等问题时可能面临挑战。此外,它们通常需要大量的计算资源和时间…

web3.0入门及学习路径

Web3是指下一代互联网的演进形式,它涉及一系列技术和理念,旨在实现去中心化、开放、透明和用户主导的互联网体验。Web3的目标是赋予用户更多的控制权和数据所有权,并通过区块链、加密货币和分布式技术来实现。 一、特点 去中心化&#xff1…

vue使用elementui组件的的对话框;使用ref

1.第一步&#xff0c;先在父组件中引用&#xff0c;设置ref的值 <el-dialog :visible.sync"dialogEditVisible"append-to-body width"1000px" title"编辑":close-on-click-modal"false"><dialog-edit v-if"dialogEditV…

【漏洞预警】Linux kernel权限提升漏洞(CVE-2024-1086)

一、漏洞概述 漏洞名称 Linux kernel权限提升漏洞 CVE ID CVE-2024-1086 漏洞类型 Use-After-Free 发现时间 2024-03-28 漏洞评分 7.8 漏洞等级 高危 攻击向量 本地 所需权限 低 利用难度 低 用户交互 无 PoC/EXP 已公开 在野利用 未知 Netfilte…

静态数码管

文章目录 前言一、静态数码管原理二、静态数码管显示1.单个数码管 奇数偶数2.显示任意四位数 0000-9999 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 课程需要&#xff1a; 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考…

HarmonyOs开发之———容器组件使用

谢谢关注!! 前言:上一篇文章主要介绍HarmonyOS 开发之———基础组件的使用。如需了解谢谢查阅:http://t.csdnimg.cn/frBpp 一、在HarmonyOS中,不同的容器组件拥有各自的属性,用于控制布局和组件的展示方式。以下是Stack(堆栈)、Column(列)、Row(行)、Flex(弹性…

DFMEA的输入与输出——SunFMEA软件

DFMEA泛应用于产品设计阶段&#xff0c;以识别潜在的失效模式&#xff0c;评估其对系统的影响&#xff0c;并制定相应的预防措施。DFMEA的输入与输出是这一过程中至关重要的两个环节&#xff0c;它们直接决定了分析的质量与效果。今天SunFMEA软件系统和大家一起分享DFMEA的输入…