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

【Linux】shell中运算符(整数、字符串)

文章目录

  • 1. 整数
    • 1.1、算数运算符
      • 1.1.1 加减乘除运算
      • 1.1.2 =号关系运算
        • 1.1.2.1 =(赋值)、==(等于)、!=(不等于)的使用
        • 1.1.2.2 >、>=、<、<=的使用
    • 1.2 $((运算式)) 双括号形式 、 $[运算式] 语法 进行运算
    • 1.3 -eq关系运算符
    • 1.4 =、==、-eq的区别
  • 2 字符串
    • 2.1 字符串运算
  • 3 逻辑运算符
  • 参考

在shell中,和其他编程语言一样也有多种运算符,常用的运算符有:算数运算符、关系运算符、逻辑运算符、字符串运算符、文件测试运算符等。

但是由于存在整数和字符串,处理的语法稍有不同;因此我们划分整数和字符串类型

1. 整数

1.1、算数运算符

算数运算符就是我们最常见的,常用的主要有+(加)、-(减)、*(乘)、/(除)、%(取余)、=(赋值)、==(等于)、!=(不等于)。

下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:

运算符说明举例
+加法`expr $a + $b` 结果为 30。
-减法`expr $a - $b` 结果为 -10。
*乘法`expr $a \* $b` 结果为  200。
/除法`expr $b / $a` 结果为 2。
%取余`expr $b % $a` 结果为 0。
=赋值a=$b 将把变量 b 的值赋给 a。
==相等。用于比较两个数字,相同则返回 true。[ $a == $b ] 返回 false。
!=不相等。用于比较两个数字,不相同则返回 true。[ $a != $b ] 返回 true。

注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]。

1.1.1 加减乘除运算

shell是不支持简单的数学运算的,这时候我们就可以使用expr命令来实现shell中的简单运算,expr 是一款表达式计算工具,使用它能完成表达式的求值操作。expr的命令使用方法是:比如1+2要写成expr 1 + 2,expr和计算公式需要写在 ` ` 中(方括号,esc下面的那个按钮)并且数值和运算符之间要有空格 `expr 1+2`是不对的。

不带运算符,会当做普通字符串进行输出:

echo "1+2"   #先试下正常的运算方式能否得到结果
#打印结果  1+2

带了运算符,如果没有空格,会当做普通字符串进行输出

echo `expr 1+2`   #数值和运算符中间没有空格时
#打印结果  1+2

正例,注意乘法运算需要转义字符

echo `expr 1 + 2`   #加法
#打印结果  3
echo `expr 2 - 1`   #减法
#打印结果  1
echo `expr 2 \* 3`   #乘法必须要使用反斜杠才能实现
#打印结果  6
echo `expr 2 * 3`   #乘法没有反斜杠时
#打印结果  expr: 语法错误echo `expr 6 / 2`   #除法
#打印结果  3
echo `expr 6 % 4`   #取余
#打印结果  2

1.1.2 =号关系运算

什么是关系运算?就是比大小、判断是否相等,常用在 if 条件判断中

出去加减乘除,剩下的符号中,有的可以进行简单的关系运算, =(单等于)、==(等于)、!=(不等于) 、>、>=、<、<=

注意:if 条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]。

不建议使用 == 、> 、 >= 等符号进行数字比较,因为如果是字符串的话,也可以使用 ,并且表示不同的含义,这样如果数字类型变量误定义为字符串类型,不容易发现错误,建议使用 -eq 语法进行比较。

1.1.2.1 =(赋值)、==(等于)、!=(不等于)的使用

在 if 语法中,放在[] 中 ,示例:

#!/bin/bash
a=10
b=20if [ $a == $b ]
thenecho "a 等于 b"       # 不打印
fi
if [ $a != $b ]
thenecho "a 不等于 b"     #打印
fi

1.1.2.2 >、>=、<、<=的使用

< 小于(需要双括号),如:  if (("$a" < "$b"))<= 小于等于(需要双括号),如: if (("$a" <= "$b"))> 大于(需要双括号),如: if (("$a" > "$b"))>= 大于等于(需要双括号),如: if (("$a" >= "$b"))

在 if 语法中,放在 (( )) 中 ,要和 中括号区分开来,示例:

a=10
b=20if(("$a" < "$b"))
thenecho "a 小于 b"       # 不打印
fi

双括号结构中,变量名引用可以加 $,也可以不加;
运算符前后可以有空格,也可以没有
但是为了方便识别,建议加 $ 并且保留空格

1.2 $((运算式)) 双括号形式 、 $[运算式] 语法 进行运算

我们也可以直接使用 + - 进行简单的运算,但是需要借助 $((运算式)) 双括号形式 和“$[运算式] 语法 ,详情参见 【Linux】 shell 常用的数据类型(数字、字符串和数组)和运算中的 <1.1 计算>章节

1.3 -eq关系运算符

这里提到的关系运算符是特殊的,通过字母实现的,而不是前文的数学符号

下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20,注意使用中括号或双中括号语法:

运算符说明举例
-eq检测两个数是否相等,相等返回 true。[ $a -eq $b ] 返回 false。
-ne检测两个数是否不相等,不相等返回 true。[ $a -ne $b ] 返回 true。
-gt检测左边的数是否大于右边的,如果是,则返回 true。[ $a -gt $b ] 返回 false。
-lt检测左边的数是否小于右边的,如果是,则返回 true。[ $a -lt $b ] 返回 true。
-ge检测左边的数是否大于等于右边的,如果是,则返回 true。[ $a -ge $b ] 返回 false。
-le检测左边的数是否小于等于右边的,如果是,则返回 true。[ $a -le $b ] 返回 true。

示例:

#!/bin/basha=10
b=20if [ $a -eq $b ]
thenecho "$a -eq $b : a 等于 b"
elseecho "$a -eq $b: a 不等于 b"    # 打印
fiif [ $a -ne $b ]
thenecho "$a -ne $b: a 不等于 b"   # 打印
elseecho "$a -ne $b : a 等于 b"
fiif [ $a -gt $b ]
thenecho "$a -gt $b: a 大于 b"
elseecho "$a -gt $b: a 不大于 b"    # 打印
fiif [ $a -lt $b ]
thenecho "$a -lt $b: a 小于 b"      # 打印
elseecho "$a -lt $b: a 不小于 b"
fiif [ $a -ge $b ]
thenecho "$a -ge $b: a 大于或等于 b"
elseecho "$a -ge $b: a 小于 b"    # 打印
fiif [ $a -le $b ]
thenecho "$a -le $b: a 小于或等于 b"   # 打印
elseecho "$a -le $b: a 大于 b"
fi

关系运算符的应用范围只支持数字(确切的说是整数,小数暂不确定),不支持字符串,因此 建议数字 进行关系运算时采用这种方案,这样如果数字类型变量误定义为字符串类型,可以及时发现错误,例如:

#!/bin/bash
a=10
b=abcif [ $a -eq $b ]
thenecho "a 不等于 b"     
fi

由于b变量是字符串,执行时报类型不是整型错误:

[ubuntu]$ ./a.sh
./a.sh: line 14: [: abc: integer expression expected

1.4 =、==、-eq的区别

(1)单等号和双等号能用于字符string类型和整型integer的相等判断。
(2)相等关系运算符“-eq”仅能用于整型integer的相等比较。
(3)相等关系运算符“-eq”不能在算数运算表达式“(( ))”中
(4)在 if 条件表达式 “[ ]”中,单等号和双等号等价,都是相等算数运算符。
(5)在算数运算表达式“(( ))”中,单等号是赋值算数运算符,双等号为相等算数运算符。

总结:在进行相等判断时,最通用的方法是使用双等号“==”相等判断符,避免使用单引号引起歧义。而且数字比较和字符串比较都可以用 == 号,并且建议数字类型时使用 -eq 语法,这样可以检测非数字异常。

2 字符串

2.1 字符串运算

参见

3 逻辑运算符

参见 【Linux】shell中的逻辑运算符

参考

Shell 基本运算符
linux shell中的比较符号与特殊符号介绍

相关文章:

【Linux】shell中运算符(整数、字符串)

文章目录1. 整数1.1、算数运算符1.1.1 加减乘除运算1.1.2 号关系运算1.1.2.1 (赋值)、(等于)、!(不等于)的使用1.1.2.2 >、>、<、<的使用1.2 $((运算式)) 双括号形式 、 $[运算式] 语法 进行运算1.3 -eq关系运算符1.4 、、-eq的区别2 字符串2.1 字符串运算3 逻辑运…...

【从零单排Golang】第八话:通过cache缓存模块示范interface该怎么用

和许多面向对象的编程语言一样&#xff0c;Golang也存在interface接口这样的概念。interface相当于是一个中间层&#xff0c;下游只需要关心interface实现了什么行为&#xff0c;利用这些行为做些业务级别事情&#xff0c;而上游则负责实现interface&#xff0c;把这些行为具象…...

解析从Linux零拷贝深入了解Linux-I/O(上)

本文将从文件传输场景以及零拷贝技术深究 Linux I/O 的发展过程、优化手段以及实际应用。前言 存储器是计算机的核心部件之一&#xff0c;在完全理想的状态下&#xff0c;存储器应该要同时具备以下三种特性&#xff1a; 速度足够快&#xff1a;存储器的存取速度应当快于 CPU …...

JavaScript系列之公有、私有和静态属性和方法

文章の目录一、公有属性、公有方法1、定义2、理解3、ES54、ES6二、私有属性、私有方法1、定义2、理解3、ES54、ES6三、静态属性、静态方法1、定义2、理解3、ES54、ES6写在最后一、公有属性、公有方法 1、定义 指的是所属这个类的所有对象都可以访问的属性&#xff0c;叫做公有…...

过滤器与拦截器

文章目录一、前言1、概述2、过滤器与拦截器异同2.1 简介2.2 异同2.3 总结3、Filters vs HandlerInterceptors二、过滤器1、概述2、生命周期2.1 生命周期概述2.2 基于函数回调实现原理3、自定义过滤器两种实现方式3.1 WebFilter注解注册3.2 过滤器&#xff08;配置类注册过滤器&…...

spring boot 和cloud 版本升级

spring boot 和cloud 版本对应 背景&#xff1a;原来一直用的版本是Hoxton.SR12 2.3.10.RELEASE&#xff08;SR12一路升&#xff0c;几乎没有影响&#xff0c;不需要测试&#xff0c;但是换大版本就有点担心&#xff09; 去年2022年底黑鸭子报漏洞把springboot&#xff0c;clou…...

untiy 录制网络摄像头视频并保存到本地文件

网络摄像头使用的是海康威视的&#xff0c;关于如何使用Ump插件播放海康威视rtsp视频流&#xff0c;请参考我的这篇文章 内部有ump插件的下载链接 untiy接入 海康威视网络摄像头 录屏使用的插件是 AVPro movieCapture 4.6.3版&#xff0c; 插件和完整工程的下载链接放在本文的…...

微服务架构设计模式-(15)部署

关联概念 流程 将软件投入到生产环境 架构 软件运行的环境结构 生产环境四个关键功能 服务管理接口 使开发人员能够创建、更新和配置服务 运行时服务管理 确保始终运行一定数量的服务实例非中断更新 监控 让开发人员了解服务情况&#xff0c;包括日志文件和各种应用指标可观…...

Redis:数据结构

简单动态字符串SDS Redis没有直接使用C语言传统的字符串表示(以空字符结尾的字符数组&#xff0c;以下简称C字符串)&#xff0c;而是自己构 建了一种名为简单动态字符串(simple dynamic string, SDS)的抽象类型&#xff0c;并将SDS用作Redis的默认字符 串表示。 SDS 的实现…...

2.18 设置language和中文输入法

文章目录一&#xff1a;设置language二&#xff1a;设置中文输入法一&#xff1a;设置language nvidia的开发板上默认只有English&#xff0c;需要点击如下管理&#xff1a; 接着进入如下界面&#xff1a; 此时图中的“汉语&#xff08;中国&#xff09;”应该是没有的&…...

图解LeetCode——剑指 Offer 28. 对称的二叉树

一、题目 请实现一个函数&#xff0c;用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样&#xff0c;那么它是对称的。 二、示例 2.1> 示例 1&#xff1a; 【输入】root [1,2,2,3,4,4,3] 【输出】true 2.2> 示例 2&#xff1a; 【输入】root [1,2,2,nul…...

Qt Desginer布局方法

首先将我们需要的控件拖拽到一个合适的位置&#xff0c;该例子中用到了两个label&#xff0c;两个lineEdit和两个pushButton。 然后我们需要利用弹簧来控制控件到控件之间的距离以及控件到窗体边界的距离&#xff0c;因为这里只有一组控件&#xff08;两个label&#xff0c;两个…...

C/C++、Java、Python的比较及学习(3)

函数间的值传递与地址传递 值传递方式&#xff1a;指主调函数把实参的值赋给形参。 在这种传递方式下&#xff0c;主调函数中的实参地址与被调函数中的形参地址是相互独立的。 函数被调用时&#xff0c;系统为形参变量分配内存单元&#xff0c;并将实参的值存入到对应形参的内存…...

智慧校园建设方案

第一章、 智慧教学 6.1. 校本资源库 提供校本资源管理功能&#xff0c;实现学校内的教学资源的共建共享&#xff0c;促进教师之间的交流学习&#xff0c;提升学校的整体教学水平。在本系统中学校可以统一采购资源接入到校本资源库中供教师下载使用&#xff0c;教师也可以将…...

ARM uboot 源码分析5 -启动第二阶段

一、start_armboot 解析6 1、console_init_f (1) console_init_f 是 console&#xff08;控制台&#xff09;的第一阶段初始化。_f 表示是第一阶段初始化&#xff0c;_r 表示第二阶段初始化。有时候初始化函数不能一次一起完成&#xff0c;中间必须要夹杂一些代码&#xff0c;…...

【ip neigh】管理IP邻居( 添加ARP\NDP静态记录、删除记录、查看记录)

一、邻居管理存在状态 1、NUD_NONE&#xff1a; 初始状态。当一个新的路由缓存条目被创建时&#xff0c;arp_bind_neighbour()函数被调用.如果找不到相匹配的ARP缓存条目, neigh_alloc()将创建一个新的ARP缓存条目并设置状态为NUD_NONE. 2、NUD_INCOMPLETE&#xff1a;未完成状…...

Java程序员线上排查问题神器-Arthas

文章目录前言一、Arthas是什么&#xff1f;二、快速入门1.下载2.如何运行三、常用命令1.dashboard2.trace总结前言 最近公司项目版本迭代升级&#xff0c;在开发新需求导致没什么时间写博客。 在开发需求的过程中&#xff0c;我写了一个接口&#xff0c;去批量调内部已经写好…...

上市公司企业持续创新能力、创新可持续性(原始数据+计算代码+计算结果)(2008-2021年)

数据来源&#xff1a;自主计算 时间跨度&#xff1a;2008-2021年 区域范围&#xff1a;沪深A股上市公司 指标说明&#xff1a; 参考何郁冰&#xff08;2017&#xff09;[1]的做法&#xff0c;将持续创新作为独立研究变量&#xff0c;同时采用创新投入指标(研发经费) 和创新…...

华为OD机试 - 考古学家(JS)

考古学家 题目 有一个考古学家发现一个石碑 但是很可惜 发现时其已经断成多段 原地发现N个断口整齐的石碑碎片 为了破解石碑内容 考古学家希望有程序能帮忙计算复原后的石碑文字组合数 你能帮忙吗 备注: 如果存在石碑碎片内容完全相同,则由于碎片间的顺序不影响复原后的碑…...

Leetcode.2100 适合打劫银行的日子

题目链接 Leetcode.2100 适合打劫银行的日子 Rating &#xff1a; 1702 题目描述 你和一群强盗准备打劫银行。给你一个下标从 0开始的整数数组 security&#xff0c;其中 security[i]是第 i天执勤警卫的数量。日子从 0开始编号。同时给你一个整数 time。 如果第 i天满足以下所…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...

0x-3-Oracle 23 ai-sqlcl 25.1 集成安装-配置和优化

是不是受够了安装了oracle database之后sqlplus的简陋&#xff0c;无法删除无法上下翻页的苦恼。 可以安装readline和rlwrap插件的话&#xff0c;配置.bahs_profile后也能解决上下翻页这些&#xff0c;但是很多生产环境无法安装rpm包。 oracle提供了sqlcl免费许可&#xff0c…...

智能职业发展系统:AI驱动的职业规划平台技术解析

智能职业发展系统&#xff1a;AI驱动的职业规划平台技术解析 引言&#xff1a;数字时代的职业革命 在当今瞬息万变的就业市场中&#xff0c;传统的职业规划方法已无法满足个人和企业的需求。据统计&#xff0c;全球每年有超过2亿人面临职业转型困境&#xff0c;而企业也因此遭…...

Matlab实现任意伪彩色图像可视化显示

Matlab实现任意伪彩色图像可视化显示 1、灰度原始图像2、RGB彩色原始图像 在科研研究中&#xff0c;如何展示好看的实验结果图像非常重要&#xff01;&#xff01;&#xff01; 1、灰度原始图像 灰度图像每个像素点只有一个数值&#xff0c;代表该点的​​亮度&#xff08;或…...

篇章一 论坛系统——前置知识

目录 1.软件开发 1.1 软件的生命周期 1.2 面向对象 1.3 CS、BS架构 1.CS架构​编辑 2.BS架构 1.4 软件需求 1.需求分类 2.需求获取 1.5 需求分析 1. 工作内容 1.6 面向对象分析 1.OOA的任务 2.统一建模语言UML 3. 用例模型 3.1 用例图的元素 3.2 建立用例模型 …...