Linux shell编程学习笔记10:expr命令 和 算术运算

news2024/9/23 21:18:55

Linux Shell 脚本编程和其他编程语言一样,支持算数、关系、布尔、字符串、文件测试等多种运算。上节我们研究了  Linux shell编程 中的 字符串运算,今天我们研究 Linux shell编程的算术运算 ,为了方便举例,我们同时对expr命令进行介绍。

一、expr命令的用法

expr(evaluate expressions)命令是Unix/Linux中的一个命令行表达式计算工具,一般用于整数值计算,但也可用于字符串操作。 之些我们也在一些实例使用了这个命令,这次我们对这个命令作一个详细的介绍。

在Linux终端输入命令expr --help,可以查看expr命令的帮助信息。

user @host: ~ $ expr --help
用法:expr 表达式
 或:expr 选项

      --help        显示此帮助信息并退出
      --version        显示版本信息并退出

将表达式的值列印到标准输出,分隔符下面的空行可提升算式优先级。
可用的表达式有:

  ARG1 | ARG2       若ARG1 的值不为0 或者为空,则返回ARG1,否则返回ARG2

  ARG1 & ARG2       若两边的值都不为0 或为空,则返回ARG1,否则返回 0

  ARG1 < ARG2       ARG1 小于ARG2
  ARG1 <= ARG2      ARG1 小于或等于ARG2
  ARG1 = ARG2       ARG1 等于ARG2
  ARG1 != ARG2      ARG1 不等于ARG2
  ARG1 >= ARG2      ARG1 大于或等于ARG2
  ARG1 > ARG2       ARG1 大于ARG2

  ARG1 + ARG2       计算 ARG1 与ARG2 相加之和
  ARG1 - ARG2       计算 ARG1 与ARG2 相减之差

  ARG1 * ARG2       计算 ARG1 与ARG2 相乘之积
  ARG1 / ARG2       计算 ARG1 与ARG2 相除之商
  ARG1 % ARG2       计算 ARG1 与ARG2 相除之余数

  字符串 : 表达式        定位字符串中匹配表达式的模式

  match 字符串 表达式        等于"字符串 :表达式"
  substr 字符串 偏移量 长度    替换字符串的子串,偏移的数值从 1 起计
  index 字符串 字符        在字符串中发现字符的地方建立下标,或者标0
  length 字符串            字符串的长度
  + TOKEN                    interpret TOKEN as a string, even if it is a
                               keyword like 'match' or an operator like '/'

  ( EXPRESSION )             value of EXPRESSION

请注意有许多运算操作符都可能需要由 shell 先实施转义。
如果参与运算的 ARG 自变量都是数字,比较符就会被视作数学符号,否则就是多义的。
模式匹配会返回"\"和"\"之间被匹配的子字符串或空(null);如果未使用"\"和"\",
则会返回匹配字符数量或是 0。

若表达式的值既不是空也不是 0,退出状态值为 0;若表达式的值为空或为 0,
退出状态值为 1。如果表达式的句法无效,则会在出错时返回退出状态值 3。

GNU coreutils online help: <http://www.gnu.org/software/coreutils/>
请向<http://translationproject.org/team/zh_CN.html> 报告expr 的翻译错误
Full documentation at: <http://www.gnu.org/software/coreutils/expr>
or available locally via: info '(coreutils) expr invocation'       

 

已经说得非常详细了。

下面我结合算术运算符的实例来进一步加深对expr命令的认识。

二、Linux Shell脚本编程中的算术运算符

运算符说明
+加法
-减法
*乘法
/除法
%取余
=赋值
==相等。用于比较两个数字,相同则返回 1(true),否则返回0(false)。
!=不相等。用于比较两个数字,不相同则返回 1(true),否则返回0(false)。

对于熟悉C/C++/Java/Javascrpt等语言的用户说,这些运算符很眼熟吧。 Linux Shell脚本编程中的算术运算符 与 C/C++/Java/Javascrpt等语言是相同的。

但是在具体应用上,Linux Shell脚本编程中有3点需要特别注意:

1.赋值运算符=

我们之前也强调过,赋值运算符=两边不能用空格分隔。

例如定义变量var1并初始化赋值为"abc",正确写法是var1="abc"。

user @host: ~ $ var1 = "abc"
var1:未找到命令
user @host: ~ $ var1="abc"
user @host: ~ $ echo $var1

abc

user @host: ~ $

2.乘法运行符*

使用乘法运行符*时,通常要在它前面加上转意符/。

3.除了赋值运算符=外,其它运算符两侧均需要用空格与运算对象分隔。

我们结合下面的操作实例来体验。

三、Linux Shell算术运算操作实例

user @host: ~ $ d1=2
user @host: ~ $ d2=3
user @host: ~ $ echo `expr $d1 + $d2`
5
user @host: ~ $ echo `expr $d1 - $d2`
-1
user @host: ~ $ echo `expr $d1 * $d2`
expr: 语法错误

user @host: ~ $ echo `expr $d1 \* $d2`
6
user @host: ~ $ echo `expr $d1 / $d2`
0
user @host: ~ $ echo `expr $d1 % $d2`
2
user @host: ~ $ echo `expr $d1 == $d2`
0
user @host: ~ $ echo `expr $d1 != $d2`
1
user @host: ~ $ echo `expr $d1!=$d2`

2!=3

user @host: ~ $ 

在上面的例子中,我们先后定义了变量d1和d2,并初始化赋值为2和3,然后对d1和d2分别进行加、减、乘、除、取余、相等 和不相等运算。

在进行乘法运算时,如果乘号*前面没有放转义符\,命令会出错:

expr: 语法错误

在最后一条命令

echo `expr $d1!=$d2`

中 不等于运算符!=和运算对象变量d1和d2之间没有放空格来间隔,!=被当成字符串原样输出:

2!=3

特别说明一点,上面实例中echo命令行中使用的是反引号,不是单引号。 

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

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

相关文章

物联网AI MicroPython传感器学习 之 Relay继电器模块

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; 一、产品简介 继电器&#xff08;英文名称&#xff1a;relay&#xff09;是一种电控制器件&#xff0c;是当输入量的变化达到规定要求时&#xff0c;在电气输出电路中使被控量发生预定的阶跃变化的一种电器。…

linux查看文件内容命令more/less/cat/head/tail/grep

1.浏览全部内容more/less 文件&#xff1a; more&#xff1a;可以查看文件第一屏的内容&#xff0c;同时左下角有一个显示内容占全部文件内容的百分比&#xff0c;空格键会显示下一屏的内容&#xff0c;直到文件末尾 [rootmaster data]# more file1less&#xff1a;相较于mor…

前端工程化(editorconfig+ESLint+Prettier+StyleLint+Husky、Commitlint)

前言 致谢&#xff1a;有来技术大大 通过学习有来技术大大的文章和结合自己的实践&#xff0c;写一篇笔记记录一下 所使用的工具&#xff1a; ide项目风格(editorconfig)代码检查(ESLint)代码风格(Prettier)样式风格(StyleLint)git提交规范(Husky、Commitlint) 一、ide项目…

【算法设计与分析】— —单源最短路径的贪心算法

&#x1f383;欢迎大家前去观看我的算法设计与分析专栏&#xff1a; 算法设计与分析_IT闫的博客-CSDN博客 希望对大家有所帮助&#xff01; &#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java…

玉柴集团用USB Server对U盾远程安全管控

在当今数字化时代&#xff0c;企业的业务规模和组织结构日益复杂&#xff0c;对于U盾这样小小的&#xff0c;但却异常重要的USB设备的管理和使用提出了更高的要求。广西玉柴机器股份有限公司作为一家综合性集团企业&#xff0c;其业务规模庞大&#xff0c;组织结构复杂&#xf…

MapReduce(林子雨慕课课程)

文章目录 7. MapReduce7.1 MapReduce简介7.1.1 分布式并行编程7.1.2 MapReduce模型简介 7.2 MapReduce体系结构7.3 MapReduce工作流程概述7.4 Shuffle过程原理7.5 MapReduce应用程序的执行过程7.6 WordCount实例分析7.7 MapReduce的具体应用7.8 MaReduce编程实践 7. MapReduce …

案例研究|DataEase助力无锡布勒业务数据可视化建设

布勒集团是一家来自瑞士的家族企业&#xff0c;在谷物与食品以及先进材料制造等领域深耕超过160年。布勒大中华区的总部位于江苏无锡。无锡布勒是一家集研发、生产、销售于一体的综合性公司&#xff0c;拥有先进的生产设备及高素质的科技研发人员&#xff0c;以谷物深加工、谷物…

代码随想录第41天 | 123.买卖股票的最佳时机III ● 188.买卖股票的最佳时机IV

123.买卖股票的最佳时机III /*** param {number[]} prices* return {number}*/ var maxProfit function (prices) {const len prices.lengthconst dp new Array(len).fill(0).map(x > new Array(5).fill(0));// 第一天买入&#xff08;第一次买入&#xff09;dp[0][1] …

c 语言基础题目:PTA L1-033 出生年

以上是新浪微博中一奇葩贴&#xff1a;“我出生于1988年&#xff0c;直到25岁才遇到4个数字都不相同的年份。”也就是说&#xff0c;直到2013年才达到“4个数字都不相同”的要求。本题请你根据要求&#xff0c;自动填充“我出生于y年&#xff0c;直到x岁才遇到n个数字都不相同的…

Jetson Orin NX 开发指南(2): 基本环境配置

本文主要是在 Jetson Orin NX 系统烧录和组件安装完成后&#xff0c;对系统进行一些基本的配置&#xff0c;需要注意的是这里的系统其实也是 ubuntu 系统&#xff0c;并且由于选择的是 &#xff0c;其对应的是 ubuntu 20.04 系统&#xff0c;接下来我将介绍一些基本的配置。 一…

【动态规划】是泰波那契数,不是斐波那契数

Problem: 1137. 第 N 个泰波那契数 文章目录 题目解读解题方法dp动态规划迭代优化✔ 复杂度Code 题目解读 首先我们来解读一下本题的意思&#x1f50d; 相信读者在看到【泰波那契数】的时候&#xff0c;不禁会联想到【斐波那契数】&#xff0c;它们呢是一对孪生兄弟&#xff0c…

【d2l动手学深度学习】 Lesson 10 多层感知机 + 代码实现 试验结果对比

文章目录 1. 介绍2. 单层Softmax回归2.1 手写Softmax训练效果 2.2 调用pytorch内置的softmax回归层实现调用pytorch内置softmax实验结果总结 3. 一层感知机&#xff08;MLP&#xff09; Softmax实验结果 Reference写在最后 1. 介绍 在第十节课 多层感知机 的代码实现部分&…

前后端分离项目-基于springboot+vue的足球青训俱乐部管理后台系统的设计与实现(内含代码+文档+报告)

博主介绍&#xff1a;✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久&#xff0c;选择我们就是选择放心、选择安心毕业✌ &#x1f345;由于篇幅限制&#xff0c;想要获取完整文章或者源码&#xff0c;或者代做&am…

4个不限字数的AI智能写作网站,用好任意一个就可以了

我们都在互联网上写过内容&#xff0c;有的人写社交媒体帖子、电子邮件或文本&#xff0c;有的人为我们的网站、产品描述、视频内容、广告甚至客户支持撰写内容。最近&#xff0c;*******推出了友好的类似聊天机器人的界面&#xff0c;使得AI写作更加容易访问&#xff0c;并迅速…

JVM上篇之类加载子系统

目录 类加载子系统 内存结构 类的生命周期 类的加载过程 加载 加载class文件方式 连接 验证 验证阶段 准备 解析 初始化 类加载器 介绍 作用 分类 引导类加载器 自定义类加载器 ClassLoader 获取ClassLoader途径 双亲委派机制 介绍 执行流程 好处 打破…

01-RocketMQ整体理解与快速实战

上一篇&#xff1a;RocketMQ从入门到精通汇总 一、MQ介绍 1、什么是MQ&#xff1f;为什么要用MQ&#xff1f; MQ&#xff1a;MessageQueue&#xff0c;消息队列。 队列&#xff0c;是一种FIFO 先进先出的数据结构。消息由生产者发送到MQ进行排队&#xff0c;然后按原来的顺序…

解决 Centos 安装 Python 3.10 的报错: Could not import runpy module

操作环境&#xff1a;CentOS 7、Gcc 4.8.5、Python 3.10.0 系统上已经有 2.x&#xff0c;3.6 版本的 Python 了&#xff0c;但是还是想装一个 3.10 的。因为刚写的脚本文件是较高版本的&#xff0c;在 3.6 上无法正常运行&#xff0c;Python 语法不是很了解&#xff0c;只能从…

[每周一更]-(第66期):Docker 守护进程说明

Docker 的优势 Build once, Run anywhere 上面这句话很精辟的总结了 docker 的优点。我从下面几点具体描述 docker 带给开发者的能力 应用标准化 无论什么语言开发的应用&#xff0c;我们都能用 dockerfile 和构建脚本方便的进行应用构建打包&#xff0c;代码库 构建 regis…

华为交换机vlan划分、telnet 管理地址配置

------1--- 1台核心交换时s5700 2台汇聚交换机S3700 6台PC -----2------ 创建vlan 10 20 30 s3700下PC1,PC2,PC3 S3700下PC4,PC5,PC6 VLAN10 PC1,PC2 VLAN20 PC3,PC4 VLAN30 PC5,PC6 -------3----- 要求实现&#xff1a; PC1,PC2互通&#xff1b; PC3,PC4互通&#xff1b; P…

【吞噬星空4】徐欣因祸得福,罗峰强势复仇,两大强者被杀,阿特金已开始自救

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析吞噬星空国漫。 吞噬星空第89集预告已经出来了&#xff0c;从预告来看&#xff0c;信息量是真的多。从徐欣因祸得福到罗峰强势复仇&#xff0c;再到两大强者被杀&#xff0c;乃至于最后的阿特金已开始自救。那么多的不说&…