掌握 Bash 中的数字比较:综合指南

2023-11-11

Bash 是 Linux 和 Unix 系统中流行的命令行 shell,允许用户通过运行脚本或执行命令来有效地执行各种任务。编写 Bash 脚本的一个关键方面是能够根据变量值或命令输出做出决策。一项常见的决策任务是比较数值。本文提供了掌握 Bash 中数字比较的综合指南。

1. 理解数字比较

在深入研究比较运算符之前,有必要了解 Bash 处理字符串而不是数字。尽管 Bash 可以执行算术运算,但它将所有值视为字符串。因此,在 Bash 中比较数值时,您应该使用专门为此目的设计的算术运算符。

2. 基本比较运算符

以下是您可以在 Bash 中使用的基本算术比较运算符:

  • `-eq`: 等于 (==)
  • `-ne`: 不等于 (!=)
  • `-lt`: 小于 (
  • `-le`: 小于或等于 (
  • `-gt`: 大于 (>)
  • `-ge`: 大于或等于 (>=)

这些运算符与‘test’ or ‘[[‘命令,如下例所示:

1
2
3
4
5
6
7
if [ $num1 -eq $num2 ]; then
  echo “数字是平等的”
fi
 
if [[ $num1 -lt $num2 ]]; then
  echo “数字 1 小于数字 2”
fi

3. 结合数字比较

您可以使用组合多个数字比较逻辑运算符 like AND(-a 或 &&) and 或(-o 或 ||)。这里有些例子:

1
2
3
4
5
6
7
if [[ $num1 -gt $num2 && $num1 -lt $num3 ]]; then
  echo “数字 1 位于数字 2 和数字 3 之间”
fi
 
if [[ $num1 -lt $num2 || $num1 -gt $num3 ]]; then
  echo “数字 1 小于数字 2 或大于数字 3”
fi

4. 实例

以下是在 Bash 脚本中使用数字比较的一些实际示例:

4.1.检查数字是偶数还是奇数:

1
2
3
4
5
if [[ $number % 2 -eq 0 ]]; then
  echo “偶数”
else
  echo “奇数”
fi

4.2.比较两个文件中的行数:

1
2
3
4
5
6
7
8
9
10
文件1_行=$(wc -l < file1.txt)
文件2行=$(wc -l < file2.txt)
 
if [[ $文件1_行 -gt $文件2行 ]]; then
  echo “文件 1 的行数多于文件 2”
elif [[ $文件1_行 -eq $文件2行 ]]; then
  echo “两个文件的行数相同”
else
  echo “文件 2 的行数比文件 1 多”
fi

5. 常见陷阱和最佳实践

  • 请记住使用双括号 ([[) 当使用逻辑运算符 (&& , ||) 来结合比较。单括号 ([)不支持这些运算符。
  • 始终使用正确的算术比较运算符 (-eq , -lt等)而不是字符串比较运算符(== , <等)进行数值比较。
  • 确保为要比较的变量分配有效的数值,以避免意外行为或错误。

结论

掌握 Bash 中的数字比较对于编写高效且无错误的脚本至关重要。通过了解基本的比较运算符、学习如何组合它们以及应用最佳实践,您可以增强 Bash 脚本的功能和多功能性。通过实际示例和对潜在陷阱的充分理解,您将能够熟练掌握 Bash 脚本和数字比较。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

掌握 Bash 中的数字比较:综合指南 的相关文章

  • 将 JSON 数组转换为 bash 数组并保留空格

    我想将 JSON 文件转换为 bash 字符串数组 稍后我可以对其进行迭代 我的JSON结构如下 USERID TMCCP CREATED DATE 31 01 2020 17 52 USERID TMCCP CREATED DATE 31
  • 为什么减法返回 - 符号

    我对简单的减法有疑问 但我不明白出了什么问题 我的代码 start date s N cut b1 13 Treatment end date s N cut b1 13 delta expr end start echo delta de
  • 伊迪德信息

    重新定义问题 有什么方法可以获取所连接显示器的序列号吗 我想收集显示器的Eid信息 当我使用 logverbose 选项运行 X 时 我可以从 xorg 0 log 文件中获取它 但问题是 如果我切换显示器 拔出当前显示器 然后插入另一个显
  • 如何使 case 语句匹配数字范围?

    我正在运行一个列号范围为 0 50 的开关案例 现在每个案例都支持离散列号 我观察到它的失败 这是代码 i 10 a 1 b 0 65 if a b then case i in 1 2 5 echo Not OK 9 10 12 echo
  • POSIX SH 构建循环变量,其元素包含空格

    这是我需要的代码 bin sh x1 a1 a2 x2 b1 b2 list SOMETHING for x in list do echo x done 以及我想要的输出 a1 a2 b1 b2 问题是 应该做什么SOMETHING是 我
  • 将“npm run start”的输出写入文件

    我想捕获的输出npm run start在一个文件中 我遇到了大量错误 我想更好地控制如何筛选输出 当我尝试时 npm run start gt log txt 我得到一个非常简短的文件 8 行 其结尾为 34m 39m 90m wdm 3
  • 从 TypeScript 运行任何 Linux 终端命令?

    有没有办法直接从 TypeScript 类中执行 Linux 终端命令 这个想法是做类似的事情 let myTerminal new LinuxTerminal let terminalResult myTerminal run sudo
  • 如何将 bash 脚本的整个输出保存到文件

    我正在尝试将 bash 脚本的整个输出保存到文件中 我目前在代码开头有一个参数 ip 地址 如下所示 bin bash USAGE Usage 0
  • 在 Linux 中禁用历史记录 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 要在 Linux 环境中禁用历史记录 我执行了以下命令 export HISTFILESIZE 0 export HISTSIZE 0 u
  • 如何删除最后一次出现模式后的所有行?

    我想删除最后一次出现模式之后的所有行 除了模式本身 file txt honor apple redmi nokia apple samsung lg htc file txt 我想要什么 honor apple redmi nokia a
  • 如何使用我在 github 中发布的 bash 脚本执行 chsh?

    我有一个要点 我总是用它来在新服务器上安装我需要的软件包 http gist github com 4372049 http gist github com 4372049 我需要做的就是通过 ssh 在新服务器中输入以下内容 bash c
  • 使用带有curl 的内部字段分隔符

    当我做 ls IFS l 我得到了我期望的输出 当我做 curl IFShttp www google com 我不 我是否误解了内部字段分隔符 如何在不使用任何空格字符的情况下运行curl 命令 您需要将变量放在大括号内 否则 shell
  • awk 子串单个字符

    这是columns txt aaa bbb 3 ccc ddd 2 eee fff 1 3 3 g 3 hhh i jjj 3 kkk ll 3 mm nn oo 3 我可以找到第二列以 b 开头的行 awk if substr 2 1 1
  • Bash 解析和 shell 扩展

    我对 bash 解析输入和执行扩展的方式感到困惑 对于输入来说 hello world 作为 bash 中的参数传递给显示其输入内容的脚本 我不太确定 Bash 如何解析它 Example var hello world displaywh
  • 仅打印“docker-container ls -la”输出中的“Names”列

    发出时docker container ls la命令 输出如下所示 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a67f0c2b1769 busybox tail f dev
  • 有没有办法让我简化这些回声? [复制]

    这个问题在这里已经有答案了 我仍在学习如何编写 shell 脚本 并且我面临着一个挑战 让我更容易回显 Name1 Name2 Name15 我不太确定从哪里开始 我已经想法 但如果我搞砸了 我不想看起来很傻 有什么帮助吗 我实际上还没有尝
  • 添加要在给定命令中运行的 .env 变量

    我有一个 env 文件 其中包含如下变量 HELLO world SOMETHING nothing 前几天我发现了这个很棒的脚本 它将这些变量放入当前会话中 所以当我运行这样的东西时 cat env grep v xargs node t
  • 两种情况或 if 哪个更快? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我必须制作一个 非常 轻的脚本 它将接受用户的选项并调用脚本中的函数来执行一些任务 现在我可以使用 IF 和 CASE 选项 但我想知道两
  • Git difftool 未启动外部 DiffMerge 程序

    我一直遵循 戴夫的博客条目 http www davesquared net 2009 05 setting up git difftool on windows html 链接在此answer https stackoverflow co
  • 如何从 bash 数组中删除元素而不展平数组

    我想创建一个采用 bash 数组的函数 如下所示 a element zero element one element two 并删除一个元素 如 元素一 并留下一个数组 如下所示 a element zero element two 这样

随机推荐

  • Docker和Dockerfile常用命令总结及微服务打包Docker镜像

    一 Docker 常用命令总结 1 帮助命令 查看docker的所有命令详情 docker help 查看docker对应命令的使用详情 docker 命令 help 如 查看docker images的使用方法 docker images
  • 《A Graduate Course in Applied Cryptography》Chapter 18 Protocols for identification and login(1)

    原文教材 与 参考资料 Boneh Dan Shoup Victor A Graduate Course in Applied Cryptography J 该书项目地址 可以免费获取 http toc cryptobook us 博客为对
  • 聊聊TCP协议的粘包、拆包以及http是如何解决的?

    目录 一 粘包与拆包是什么 二 粘包与拆包为什么发生 三 遇到粘包 拆包怎么办 解决方案1 固定数据大小 解决方案2 自定义请求协议 解决方案3 特殊字符结尾 四 HTTP如何解决粘包问题的 4 1 读取请求行 请求头 响应行 响应头 4
  • Fourth season eleventh episode,Phoebe wants to be her brother‘s surrogate mother(has baby for him)??

    Scene Central Perk Frank and Alice are there talking with Phoebe Phoebe Oh my God I can t believe my little brother is m
  • 【Ubuntu14.04安装】网络初始化配置

    一 环境 1 Ubuntu Server 14 04 2 Vmware Workstation 9 0 3 物理机 Windows7 64bit i5 3470 3 20Hz 8GB 二 基本点 1 弄清楚物理机和虚拟机之间的连接途径有三种
  • BroadcastReceiver普通广播、有序广播、拦截广播、本地广播、Sticky广播、系统广播

    http blog csdn net qq 30379689 article details 53341313 前言 BroadcastReceiver的简介 普通广播 自定义广播 有序广播 拦截广播 本地广播 Sticky广播 系统广播
  • 直流电机PID调速

    文章写的是基于数字PID控制器的闭环电机速度控制系统 系统以STC89C51单片机为控制核心 通过电机驱动L298N 这里因为所用电机是个小马达 额定电流和堵转电流不算大 所以用的是TC1508S做驱动 控制电机转速 电机转速控制采用PWM
  • 2013年CSDN高校俱乐部全国百所高校巡讲讲师招募

    CSDN高校俱乐部 以下简称 俱乐部 是由全球最大中文IT技术社区CSDN发起的 由全国各高校在校生代表自发加入的IT技术学习型组织 CSDN由此搭建起行业与校园之间的桥梁 公益为各俱乐部提供行业资讯 技术学习 专家交流 技术竞赛等学习服务
  • markdown绘图插件----mermaid简介

    作者 黄永刚 mermaid简介 当撰写文档的时候 对于流程图的生成大多使用Visio等繁重的工具 没有一种轻便的工具能够画图从而简化文档的编写 就像markdown那样 mermaid解决这个痛点 这是一个类似markdown语法的脚本语
  • [PDDL人工智能] 02.PDDL规划领域定义语言之语法理解和示例详解

    智能规划来源于人工智能对理性行为研究 针对一个具体行为的实施目的 开展动作规划以模拟或指导行为的实施 是AI开展研究的关键问题 本文主要介绍PDDL规划领域定义语言的基础语法知识和示例详解 希望文章对您有所帮助 该系列文章主要介绍PDDL人
  • 如何在 Debian 11 上安装 NVM

    NVM 代表 Node Version Manager 它是一个用于安装 Node js 的命令行实用程序 它只允许程序员在他们的帐户中安装 Node js 这意味着安装是根据用户特定完成的 单个系统中的所有用户都有自己的 Node js
  • 如何在 Ubuntu 18.04 中添加交换空间

    交换对于需要比物理可用内存更多的 RAM 的系统非常有用 如果内存已满并且系统需要更多 RAM 才能正常运行应用程序 它会检查交换空间并在那里传输文件 一般来说 交换区是硬盘的一部分 用作系统上的 RAM 我有一个正在运行的虚拟机 上面没有
  • 如何在 Apache 中配置 X-Frame-Options

    X Frame Options 用作 HTTP 响应标头 这可以防止您的网站内容嵌入到其他网站中 根据此值 浏览器允许其他站点在 iframe 中打开网页 它还可以保护您的 Apache Web 服务器免受点击劫持攻击 X Frame Op
  • 如何在基于 Debian 的系统上从源代码安装 Wine

    作为 Windows 程序的狂热用户 您可能会发现有时需要在 Ubuntu 系统上使用特定程序 尽管还有其他选项 例如虚拟机或 Wine 等程序 它有助于在 Linux 上运行 Windows 程序 但它们涉及一些工作 而且并不是运行这些程
  • 了解互联网协议 (IP)

    数字时代的定义是连通性 从个人消息传递到商业通信再到国际政府关系 几乎所有交互都是通过万维网进行的 互联网协议 IP 是这个庞大网络的核心 可确保通信顺畅可靠 本文旨在阐明我们数字生活的这一基本方面 什么是互联网协议 IP 从最广泛的意义上
  • 如何使用 Rsyslog 和 MySQL 设置 LogAnalyzer

    本文是文章的第二部分使用 MySQL 和 LogAnalyzer 设置 Rsyslog在 CentOS RHEL 系统上 在里面第一部分我们已经将Rsyslog与MySQL数据库服务器集成 所有日志现在都保存在数据库中 下面是我们在第 1
  • 如何在 Ubuntu 22.04 上安装 Linux、Nginx、MySQL 和 PHP(LEMP Stack)

    Linux操作系统是非常流行且广泛使用的服务器操作系统 它为世界上大多数网站提供支持 包括雅虎 谷歌和 Facebook 等一些最著名的网站 逻辑首字母缩略词 LAMP 通常用来指自由和开源软件的混合物 这些软件经常一起使用来创建可以处理动
  • 如何统治科技世界?

    谷歌 Facebook 苹果和微软等科技巨头正在真正统治世界 他们不仅在商业和技术领域做出了贡献 而且还大力投资于社会责任项目 当他们从车库或大学宿舍起步时 是什么让他们成为科技界的巨头 他们的成功有很多因素 但所有这些科技巨头都有一些共同
  • 如何在 Debian 11/10 上安装 Tomcat 10

    Apache Tomcat 是一个开源 Web 服务器 带有用于发布基于 Java 的 Web 应用程序的 Servlet 容器 Tomcat 是由 Apache 软件基金会支持下的开放开发者社区开发和维护的 截至目前 Tomcat 10
  • 掌握 Bash 中的数字比较:综合指南

    Bash 是 Linux 和 Unix 系统中流行的命令行 shell 允许用户通过运行脚本或执行命令来有效地执行各种任务 编写 Bash 脚本的一个关键方面是能够根据变量值或命令输出做出决策 一项常见的决策任务是比较数值 本文提供了掌握