Linux———— 运算命令
Shell与其他编程语言一样,支持多种类型的运算符,包括:
算术运算符:用于执行数学运算,例如加法、减法、乘法和除法。
关系运算符:用于比较两个值之间的关系,例如相等、大于、小于等。
布尔运算符: 用于执行逻辑运算,例如逻辑与、逻辑或、逻辑非。
字符串运算符:用于处理字符串,例如字符串连接、字符串相等性检查。
文件测试运算符: 用于检查文件属性,例如文件是否存在、文件是否可读等。
expr命令
expr (evaluate expressions 的缩写),译为“表达式求值”, `expr`是一种表达式计算工具,用于执行表达式求值操作。Shell expr 是一个功能强大,并且比较复杂的命令,它除了可以实现整数计算,还可以结合一些选项对字符串进行处理,例如计算字符串长度、字符串比较、字符串匹配、字符串提取等。
常用的算术运算符,假定变量 a 为 1,变量 b 为 2:
| 运算符 | 说明 | 举例 |
|---|---|---|
| + | 加法 | expr $a + $b 结果为 3 |
| - | 减法 | expr $a - $b 结果为 -1 |
| * | 乘法 | expr $a \* $b 结果为 2 |
| / | 除法 | expr $b / $a 结果为 2 |
| % | 取余 | expr $b % $a 结果为 0 |
| = | 赋值 | a=$b 将把变量 b 的值赋给 a |
注意:
- 表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
- 完整的表达式要被 ` ` 包含,注意使用的是反引号 ` 而不是单引号 ',这个字符不是常用的单引号,在 Esc 键下边。
- 如果四则运算中如果使用了(),需要转义
\( 30+ 1 \)
求值表达式
算术运算符表达式(交互式)
expr 1 + 11 # 返回: 12
expr \( 30 + 10 \) \* 2 + 100 # 返回:180
获取计算结果赋值给新变量语法
result=`expr 1 + 1` # 输出result得到结果: 2
2).echo+管道
字符串语法
| 语法 | 说明 | 示例 |
|---|---|---|
| expr length 字符串 | 计算字符串的长度 | expr length "helloworld" 返回: 10 |
| expr substr 字符串 start end | 截取字符串 | expr substr "helloworld" 1 2 返回: hestart 截取字符串的起始位置,从1开始end 截取字符串的结束位置,包含这个位置截取 |
| expr index 被查找字符串 需要查找的字符 | 获取第一个字符在字符串中出现的位置 | expr index "helloworld" l 返回: 3 |
| expr match 字符串 正则表达式expr 字符串 : 正则表达式 | 正则表达式匹配,返回值为符合匹配字符的长度,否则返回为0 "expr match" 命令用于匹配一个字符串中的部分文本,而正则表达式 ".*o" 的含义如下:
| expr match "helloworld" ".*o" 返回: 7 |
运行效果:
(())命令
双小括号(( )),用于进行数学运算表达式的执行 , 将数学运算表达式放在((和))之间。可以使用 获取(())表达式命令的结果,这和使用 获得变量值是一样的。
| 语法 | 说明 |
|---|---|
| ((a=64+6)) ((b=a-6)) ((c=a+b*2)) | 这种写法可以在计算完成后给变量赋值。以 ((b=a-6)) 为例,即将 a-6的运算结果赋值给变量 c。 注意,使用变量时不用加$前缀,(( )) 会自动解析变量名。 |
| a=$((1+6) b=$((a-1)) c=$((a+b*2)) | 可以在 (( )) 前面加上$符号获取 (( )) 命令的执行结果,也即获取整个表达式的值。以 c=$((a+b*2)) 为例,即将 a+b 这个表达式的运算结果赋值给变量 c。 注意,如果 c=((a+b)) 这样的写法是错误的,不加$就不能取得表达式的结果。 |
| ((a>7 && b==c)) | (( )) 也可以进行逻辑运算,在 if 语句中常会使用逻辑运算。 |
| echo $((a+10)) | 需要立即输出表达式的运算结果时,可以在 (( )) 前面加$符号。 |
| ((a=3+5, b=a+10)) | 对多个表达式同时进行计算, 多表表达式使用”,”号隔开 |
注意: 符号之间有无空格都可以 , (( a = 1 + 6 )) 等价于 ((a=1+6))
示例:ce.sh脚本代码
#!/bin/bash
# 计算1+6赋值给变量a
((a=1+6))# 计算变量a-1赋值给变量b
((b=a-1))# 计算变量a+变量b赋值给变量c
((c=a+b))# 打印变量a,变量b, 变量c的值
echo "a=${a},b=${b},c=${c}"# $赋值写法
a=$((1+6)) b=$((a-1)) c=$((a+b))
echo "a=${a},b=${b},c=${c}"# (())多个表达式计算赋值
((a=1+6,b=a-1,c=a+b))
echo "a=${a},b=${b},c=${c}"# echo输出直接使用(())
echo "1+6=$((1+6))"# (()) 用于逻辑表达式 在if中使用
if ((a>7 && b==c))
thenecho "a>7 && b==c 成立"
elseecho "a>7 && b==c 不成立"
fi
运行效果:

总结:
- 括号内赋值: ((变量名=整数表达式))
- 括号外赋值: 变量名=$((整数表达式))
- 多表达式赋值: ((变量名1=整数表达式1,变量名2=整数表达式2,…))
- 与if条件句配合使用: if ((整数表达式))
let命令
let 命令和双小括号 (( )) 在数字计算方面功能一样。但是没有(())功能强大,let只能用于赋值计算,不能直接输出,不可以条件判断一起使用。let主要用于赋值,是最简洁的整数运算赋值命令。
let 赋值表达式
# 计算赋值用法: let 变量名=整数运算表达式
# 多个表达式计算赋值用法: let 变量名1=整数运算表达式1 变量名2=整数运算表达式2 ...
- 语法功能等价于
((表达式)) - 多个表达式之间使用空格,不是”
,“号 - 对于类似
let a+b这样的写法,Shell 虽然计算了 a+b 的值,但却将结果丢弃。如果echo let a+b会直接输出字符串a+b;若不想这样,可以使用let sum=a+b将 a+b 的结果保存在变量 sum 中。
$[]命令
在Linux和Unix Shell中,`$[]` 是一种旧的、过时的方法用于执行数学运算。它可以用来计算表达式的值。例如,您可以使用 `$[]` 来执行基本的算术运算,如加法、减法、乘法和除法。

效果展示:

四种计算命令对比
| 命令 | 优点 | 缺点 |
|---|---|---|
| expr | 可以直接输出。 | 计算表达式里面引用变量使用$,特殊字符需要转义,只能计算一个表达式。 |
| (( )) | 直接输出,里面直接使用变量名,特殊字符不需要转义,多个表达式赋值。(直接求值输出推荐方式) | 需要获取值以后才可以输出。 |
| let | 赋值简单,特殊字符不需要转义。(赋值推荐方式) | 不能直接输出。 |
| $[ ] | 特殊字符不需要转义。 | 不能多表达式计算。 |
bc命令
Bash Shell内置了对整数运算的支持,但是并不支持浮点运算,而 linux bc (basic calculator)命令可以很方便的进行浮点运算。bc命令是Linux简单的计算器,能进行进制转换与计算。能转换的进制包括十六进制、十进制、八进制、二进制等。可以使用的运算符号包括(+)加法、(-)减法、(*)乘法、(/)除法、(^)指数、(%)余数等。
bc [options] [参数]
选项options:
| 选项 | 说明 |
|---|---|
| -h | help,帮助信息 |
| -v | version,显示命令版本信息 |
| -l | mathlib, 使用标准数学库,例如使用内置函数就需要必须使用这个参数 |
| -i | interactive,强制交互 |
| -w | warn,显示 POSIX 的警告信息 |
| -s | standard,使用 POSIX 标准来处理 |
| -q | quiet,不显示欢迎信息 |
注意:
默认使用bc命令后回车会有很多欢迎信息, 可以使用
bc -q回车后不会有欢迎信息bc命令交互式下,输入quit 即可回到当前目录
bc需要每个表达式单独一行,并且要在运算符周围使用空格
参数:指定包含计算任务的文件。
常见的内置函数:
| 函数名 | 作用 |
| s(x) | 计算x的正弦值,x是弧度值 |
| c(x) | 计算x的余弦值,x是弧度值 |
| a(x) | 计算x的正切值,返回弧度值 |
| l(x) | 计算x的自然对数 |
| e(x) | 求e的x次方 |
| j(n,x) | 计算从n到x的阶数 |
测试效果:
文件可以执行多条语句:

相关文章:
Linux———— 运算命令
Shell与其他编程语言一样,支持多种类型的运算符,包括: 算术运算符:用于执行数学运算,例如加法、减法、乘法和除法。 关系运算符:用于比较两个值之间的关系,例如相等、大于、小于等。 布尔运算…...
批量去除pdf每一页相同未知的同样的内容
例如我想去除每一页右下角的www.alevelcollege.com ①打开acrobat pro ②编辑文件和图像 ③ctrlF输入字符串www.alevelcollege.com替换为空 ④鼠标点击替换 ⑤回车键按下不放,会自动翻页,直到翻页到最后一页。...
HCIA数据通信——静态路由
之前的文章中我提到过静态路由: 数据通信——网络层(路由器以及数据转发流程)_路由器如何转发数据_咕噜跳的博客-CSDN博客这里只做一些简单描述。 路由器关注的是网络之间的通信。路由器以自身为中心,考虑的是如何将数据发送到目…...
Fourier分析导论——第2章——Fourier级数的基本属性(E.M. Stein R. Shakarchi)
第 2 章 Fourier级数的基本属性(Basic Properties of Fourier Series) Nearly fifty years had passed without any progress on the question of analytic representation of an arbitrary function, when an assertion of Fourier threw new light on the subject. Thus…...
redis实现分布式延时队列
文章目录 延时队列简介应用场景案例:考虑:实现:整体思路:具体实现生产者消费者 运行结果 redis分布式延时队列优势redis分布式延时队列劣势 延时队列简介 延时队列是一种特殊的消息队列,它允许将消息在一定的延迟时间…...
Spring AOP源码解读
今天我们来分析Spring中AOP的源码,主要是关于SpringAOP是如何发挥作用的。 前期准备 首先我们需要有一个Spring AOP项目,添加好了SpringAOP的依赖。 <dependency><groupId>org.springframework</groupId><artifactId>spring-co…...
JavaScript基础入门01
目录 1.初识 JavaScript 1.1JavaScript 是什么 1.2发展历史 1.3JavaScript 和 HTML 和 CSS 之间的关系 2.JavaScript 的组成 3.前置知识 3.1第一个程序 4.JavaScript 的书写形式 4.1 行内式 4.2. 内嵌式 4.3.外部式 5.注释 6.输入输出 6.1输入: prompt 6.2输出: …...
yum 命令
基本语法 yum [选项] [参数] 选项说明 -y 对所有提问都回答“yes” 参数说明 实操 yum list | grep firefox yum -y remove firefox yum -y install firefox...
Nginx 部署多个安全域名,多个服务【工作记录】
以下是本人通过Docker 部署的Nginx挂载出来的文件目录 先看下 nginx.conf 配置文件内容:如下 ps:当前文件就是安装后的初始内容,无修改。主要关注最后一行 include /etc/nginx/conf.d/*.conf;表示引入其他目录下的.conf配置文件;…...
性能测试QPS+TPS+事务基础知识分析
本篇文章是性能测试基础篇,主要介绍了性能测试中对QPSTPS事务的基础知识分析,有需要的朋友可以借鉴参考下,希望可以对广大读者有所帮助 事务 就是用户某一步或几步操作的集合。不过,我们要保证它有一个完整意义。比如用户对某一…...
PSP - 蛋白质复合物 AlphaFold2 Multimer MSA Pairing 逻辑与优化
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/134144591 在蛋白质复合物结构预测中,当序列 (Sequence) 是异源多链时,无论是AB,还是AABB,都需要 …...
C++中vec.size()-1的坑
问题描述:如下代码, #include <iostream> #include <vector>using namespace std;int main() {vector<int> vec {};for (int i 0; i < vec.size() - 1; i) {cout << "i " << i << ", vec[i] …...
Flask Shell 操作 SQLite
一、前言 这段时间在玩Flask Web,发现用Flask Shell去操作SQLite还是比较方便的。今天简单地介绍一下。 二、SQLite SQLite是一种嵌入式数据库,它的数据库就是一个文件,处理速度快,经常被集成在各种应用程序中,在IO…...
Mybatis—XML配置文件、动态SQL
学习完Mybatis的基本操作之后,继续学习Mybatis—XML配置文件、动态SQL。 目录 Mybatis的XML配置文件XML配置文件规范XML配置文件实现MybatisX的使用 Mybatis动态SQL动态SQL-if条件查询 \<if\>与\<where\>更新员工 \<set\>小结 动态SQL-\<forea…...
excel求差公式怎么使用?
利用excel求差,可能有许多的小伙伴已经会了,不过还是存在一些不太熟悉的朋友们,所以这里有必要讲解一下。其实求差的实现主要就是一个公式,就是用一个单元格中的数字“减去”另一个单元格中的数字“等于”第三个单元格。此公式掌握…...
高效分割分段视频:提升您的视频剪辑能力
在数字媒体时代,视频剪辑已经成为一项重要的技能。无论是制作个人影片、广告还是其他类型的视频内容,掌握高效的视频剪辑技巧都是必不可少的。本文将介绍如何引用云炫AI智剪高效地分割和分段视频,以提升您的视频剪辑能力。以下是详细的操作步…...
【c++|opencv】二、灰度变换和空间滤波---2.直方图和均衡化
every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 图像直方图、直方图均衡化 1. 图像直方图 #include <iostream> #include <opencv2/opencv.hpp>using namespace cv; using namespace std;…...
【Windows】线程同步之信号量(Semaphores)
概述: semaphores 的说明和使用 微软官方文档: Semaphore Objects - Win32 apps | Microsoft Learn Semaphores是解决各种 producer/consumer问题的关键要素。这种问题会存有一个缓冲区,可能在同一时间内被读出数据或被写入数据。 理论可以证…...
二叉树问题——前中后遍历数组构建二叉树
摘要 利用二叉树的前序,中序,后序,有序数组来构建相关二叉树的问题。 一、构建二叉树题目 105. 从前序与中序遍历序列构造二叉树 106. 从中序与后序遍历序列构造二叉树 889. 根据前序和后序遍历构造二叉树 617. 合并二叉树 226. 翻转二…...
Java保留n位小数的方法(超简洁)
要输出double类型保留n位小数的几种方法如下: 我们以保留6位小数为例 方法一:使用DecimalFormat类 import java.text.DecimalFormat;public class Main {public static void main(String[] args) {double number 3.141592653589793;DecimalFormat df …...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
