expr命令全解

news/2025/10/7 13:28:12/文章来源:https://www.cnblogs.com/codingkf/p/19128414

expr命令全解

expr(expression 的缩写)是 Linux/Unix 系统中一款经典的命令行工具,主要用于整数运算、字符串处理和逻辑判断。它通过命令行参数接收表达式,计算并输出结果,常被用于 shell 脚本中处理简单的数值和字符串操作。本文将从基础语法到高级用法,全面解析 expr 命令的功能与实践。

一、expr 基本语法与特性

1. 语法格式

expr 的核心语法非常简单,通过空格分隔表达式的各个元素:
expr 表达式
 
其中,“表达式” 可以是整数运算(如 1 + 2)、字符串操作(如 length "hello")或逻辑判断(如 5 > 3)。

2. 核心特性

  • 无交互模式:所有操作通过命令行参数完成,无交互式输入;
  • 返回值规则:
    • 计算成功时,输出表达式结果(整数或字符串);
    • 计算失败时(如语法错误、运算不成立),输出空值,且返回状态码非 0(可通过 $? 查看);
  • 适用场景:shell 脚本中处理简单运算、字符串长度计算、模式匹配等轻量任务。

二、整数运算:最常用的核心功能

expr 支持基本的整数算术运算,包括加、减、乘、除、取余,运算符号前后必须有空格(否则会被视为字符串)。

1. 加法(+)

expr 10 + 5  # 输出:15
expr 2 + -3  # 支持负数,输出:-1
 

2. 减法(-)

expr 10 - 5  # 输出:5
expr 5 - 10  # 输出:-5
 

3. 乘法(*)

注意:* 在 shell 中是通配符,必须用反斜杠 \ 转义:
expr 10 \* 5  # 输出:50
expr 3 \* -2  # 输出:-6
 

4. 除法(/)

仅支持整数除法,结果向下取整(截断小数部分):
expr 10 / 3   # 输出:3(10÷3=3.333,截断为3)
expr 7 / 2    # 输出:3
expr -10 / 3  # 输出:-3(向下取整)
 

5. 取余(%)

返回除法的余数(结果符号与被除数一致):
expr 10 % 3   # 输出:1(10 = 3×3 + 1)
expr 7 % 2    # 输出:1
expr -10 % 3  # 输出:-1(-10 = 3×(-4) + (-1))
 

三、字符串操作:处理文本的实用功能

expr 提供了简单的字符串处理能力,包括计算长度、查找字符位置、模式匹配等,适合轻量文本处理场景。

1. 计算字符串长度(length)

expr length "hello"        # 输出:5("hello"有5个字符)
expr length "hello world"  # 输出:11(包含空格)
 

2. 查找字符在字符串中首次出现的位置(index)

expr index "字符串" "字符集":返回 “字符集” 中任意字符在 “字符串” 中首次出现的位置(从 1 开始计数,无匹配则返回 0)。
expr index "hello" "l"     # 输出:3("l"在"hello"中首次出现在第3位)
expr index "hello" "aeiou" # 输出:2(元音字母"e"在第2位)
expr index "hello" "xyz"   # 输出:0(无匹配字符)
 
注意:index 匹配的是 “字符集中的任意单个字符”,而非字符串整体。

3. 字符串模式匹配(match 或 :)

用于判断字符串是否匹配指定模式(支持基础正则表达式),返回匹配的长度(无匹配则返回 0)。两种语法等价:
expr match "字符串" "模式"
expr "字符串" : "模式"
 

常用示例:

# 匹配以"he"开头的字符串,返回匹配长度
expr match "hello" "he"       # 输出:2
expr "hello" : "he"           # 输出:2# 匹配数字开头的字符串(正则 \([0-9]\+\) 捕获数字)
expr "123abc" : "\([0-9]\+\)" # 输出:3(匹配"123",长度3)
expr "abc123" : "\([0-9]\+\)" # 输出:0(非数字开头,无匹配)# 匹配任意字符(. 表示任意单字符,* 表示前面字符出现0次或多次)
expr "test.txt" : "test.*"    # 输出:8("test.txt"整体匹配,长度8)
 
说明:模式中的 \(` 和 `\) 用于捕获匹配的子串(仅返回捕获部分的长度),无捕获时返回整个匹配的长度。

4. 提取子字符串(substr)

expr substr "字符串" 起始位置 长度:从 “起始位置”(从 1 开始)提取指定 “长度” 的子串。
expr substr "hello world" 1 5   # 输出:hello(从第1位开始,取5个字符)
expr substr "hello world" 7 5   # 输出:world(从第7位开始,取5个字符)
expr substr "hello" 3 2         # 输出:ll(从第3位开始,取2个字符)
 

四、逻辑判断:比较与条件验证

expr 可进行整数或字符串的比较运算,返回1(真) 或0(假),常与 shell 条件语句(如 if)结合使用。

1. 整数比较

运算符含义示例(返回 1 为真,0 为假)
= 等于 expr 5 = 5 → 1;expr 5 = 3 → 0
!= 不等于 expr 5 != 3 → 1;expr 5 !=5→0
> 大于 expr 5 > 3 → 1;expr 3 >5→0
< 小于 expr 3 < 5 → 1;expr 5 <3→0
>= 大于等于 expr 5 >=5 →1;expr 3 >=5→0
<= 小于等于 expr 3 <=5 →1;expr 5 <=3→0
注意:< 和 > 在 shell 中是重定向符号,必须用反斜杠 \ 转义:
expr 5 \> 3  # 输出:1(5>3为真)
expr 3 \< 5  # 输出:1(3<5为真)
 

2. 字符串比较

字符串比较仅支持 =(等于)和 !=(不等于),按字符 ASCII 码逐位比较:
expr "abc" = "abc"   # 输出:1(相等)
expr "abc" = "abd"   # 输出:0(不相等)
expr "abc" != "def"  # 输出:1(不相等)
 

3. 在 shell 脚本中结合条件判断

#!/bin/bash
a=10
b=5# 判断 a 是否大于 b
if [ $(expr $a \> $b) -eq 1 ]; thenecho "$a 大于 $b"
elseecho "$a 不大于 $b"
fi
# 输出:10 大于 5
 

五、实战场景:expr 命令的典型用法

1. 脚本中简单的数值计算

#!/bin/bash
# 计算两个数的和、差、积、商
read -p "输入第一个数:" num1
read -p "输入第二个数:" num2sum=$(expr $num1 + $num2)
diff=$(expr $num1 - $num2)
prod=$(expr $num1 \* $num2)
quotient=$(expr $num1 / $num2)echo "和:$sum"
echo "差:$diff"
echo "积:$prod"
echo "商:$quotient"
 

2. 验证输入是否为纯数字

利用模式匹配判断字符串是否全为数字:
#!/bin/bash
read -p "请输入一个数字:" input# 匹配纯数字(^ 表示开头,$ 表示结尾,[0-9]\+ 表示1个以上数字)
if [ $(expr "$input" : "^[0-9]\+$") -gt 0 ]; thenecho "输入是纯数字"
elseecho "输入不是纯数字"
fi
 

3. 提取文件名与扩展名

#!/bin/bash
file="document.txt"# 提取文件名(不包含扩展名)
filename=$(expr "$file" : "\(.*\)\.")
# 提取扩展名
extension=$(expr "$file" : ".*\(\..*\)")echo "文件名:$filename"   # 输出:document
echo "扩展名:$extension" # 输出:.txt
 

六、注意事项与局限性

1. 必须注意的语法细节

  • 运算符前后必须有空格:expr 1+2 会被视为字符串 “1+2”,返回错误;正确写法是 expr 1 + 2
  • 特殊字符需转义:*()<> 等在 shell 中有特殊含义,必须用 \ 转义(如 \*\<)。
  • 字符串含空格需加引号:如 expr length "hello world",不加引号会被解析为多个参数,导致错误。

2. 局限性

  • 不支持浮点数运算:expr 仅能处理整数,浮点数计算需用 bc 或 awk(如 echo "2.5 + 3.5" | bc)。
  • 正则表达式支持有限:仅支持基础正则(如 *+[]),不支持扩展正则(如 ?() 分组)。
  • 性能较低:复杂运算或大量数据处理时,效率远低于 awk 或 Python 脚本。

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

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

相关文章

斑马打印机打印头更换教程

斑马 ZT210 打印头更换教程 1、前期准备 首先将打印机断电,取下碳带和纸。 取碳带步骤:向上松开打印头,将旧碳带向右侧取下。 2、取下旧打印头 碳带和纸取下后,将打印头向下压紧。此时将黑色卡扣向前推动,打印头就…

构造中国剩余定理方程组的解

给你一个同余方程组: \[\begin{cases} x\equiv b_1(\text{mod}\ c_1)\\ x\equiv b_2(\text{mod}\ c_2)\\ \dots\\ x\equiv b_n(\text{mod}\ c_n) \end{cases} \]其中 \(c_i\) 两两互素,求解。 我们令 \(M = \display…

做动感影集的网站wordpress+下载媒体库

目录 1. qsort是什么&#xff1f; 2. 为什么要使用qsort 3. qsort的使用 3.1 qsort的返回值和参数 3.2 qsort的compare函数参数 3.3 int类型数组的qsort完整代码 4. qsort完整代码 1. qsort是什么&#xff1f; qsort中的q在英语中是quick&#xff0c;快速的意思了&#…

2025粒度仪厂家最新品牌推荐榜,喷雾粒度分析仪, 激光粒度仪,激光粒度分析仪,纳米粒度仪公司推荐

在颗粒表征技术愈发关键的当下,粒度仪已成为金属粉、非金属矿粉、医药、化工等多个领域不可或缺的检测设备。然而,市场上粒度仪品牌与产品层出不穷,质量与性能参差不齐,给企业和科研机构的选购带来了诸多困扰。部分…

rsync基本命令和用法

rsync基本命令和用法rsync(remote sync)是一款开源的文件同步工具,以增量传输为核心优势 —— 仅传输源和目标之间的差异部分,而非完整文件,大幅节省带宽和时间。它支持本地文件同步、远程服务器间同步(通过 SSH…

MTK oppoR9m Smart Phone flash Tool 提示 ERROR: STATUS_ABORT(0xC0010002)

前言全局说明注意:刷机,会丢失用户:照片、聊天等信息资料。请备份基带等信息。请慎重刷机 !!! 注意:刷机,会丢失用户:照片、聊天等信息资料。请备份基带等信息。请慎重刷机 !!! 注意:刷机,会丢失用户:照片、聊…

详细介绍:ArcGIS Pro 3.4 二次开发 - 布局

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

哪家网站潍坊微信网站

icoding复习 1 链表 倒数查找 1. 已知一个带有表头结点的单链表, 假设链表只给出了头指针L。在不改变链表的前提下&#xff0c;请设计一个尽可能高效的算法&#xff0c; 查找链表中倒数第k个位置上的结点&#xff08;k为正整数&#xff09;。 函数原型为&#xff1a;int lnk_s…

XMind 2025 破解版下载及安装使用教程

XMind 2025 破解版下载及安装使用教程XMind 2025是一款风靡全球的头脑风暴和思维导图软件,为激发灵感和创意而生。 在国内使用广泛,拥有强大的功能,包括思维管理、商务演示、与办公软件协同工作等功能。XMind中文版…

Xmind Pro v24 最新破解版下载及激活教程

Xmind Pro v24 最新破解版下载及激活教程Xmind 应该是目前最好用的一款思维导图软件了。拥有优秀的用户体验,凭借简单易用,功能强大的特点,XMind在2013年被著名互联网媒体Lifehacker评选为全球最受欢迎的思维导图软…

二分图最大匹配 Dinic/EK算法

方法 二分图转换成网络流模型;创建虚拟源点和汇点,将源点连上左边所有点,右边所有点连上汇点,容量皆为1。原来的每条边从左往右连边,容量也皆为1,最大流即最大匹配。code:洛谷P3386 dinic: #include<bits/std…

基本Dos指令

基本的Dos指令 打开命令提示符窗口的方式 正常打开方式Win+R 在输入框中输入cmd 回车(推荐)在开始菜单中搜索cmd 选中cmd双击打开在资源管理器地址栏右键输入cmd 回车任意文件目录下,shift+鼠标右键选择用powershel…

2025 年酒店一次性用品源头厂家最新推荐排行榜:含牙签牙线筷子套杯盖杯垫杯套外卖筷子印刷房卡套信封用品优质供应商盘点

在酒店行业竞争日益激烈的当下,一次性用品作为酒店服务品质的重要组成部分,其质量、配套能力及环保属性直接影响客人体验与酒店口碑。然而当前市场上,部分厂家存在质量把控不严、产品种类单一、供货效率低等问题,导…

2025餐饮一次性用品厂家最新推荐排行榜:聚焦资质口碑与产品实力,助力餐饮企业精准选品!

当前餐饮行业对一次性用品的需求持续增长,但市场乱象却让采购决策难度陡增。部分厂家缺乏合规资质,产品存在卫生不达标、材质安全隐患等问题,而餐饮企业既要满足消费者对环保与品质的高要求,又需兼顾定制化采购与成…

基于随机函数链接神经网络(RVFL)的锂电池健康状态(SOH)预测 - 指南

基于随机函数链接神经网络(RVFL)的锂电池健康状态(SOH)预测 - 指南2025-10-07 13:09 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: aut…

Google与华为

Google与华为A: 为何Google要跟华为作对?Q: 这是一个很好的问题。要理解“Google为何要与华为作对”,其实需要分清楚: 严格来说,不是Google主动要跟华为作对,而是因为美国政府的政策导致Google被迫与华为“切割”…

[线上故障case]vmstorage的tsid cache太小,导致 CPU 100%

[线上故障case]vmstorage的tsid cache太小,导致 CPU 100%作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!cnblogs博客 zhihu Github 公众号:一本正经的瞎扯具体的故障细节请看:vm_slow_row_inserts_tot…

Docker 部署 PostgreSQL 数据库教程

本文详细介绍基于轩辕镜像的Docker部署PostgreSQL流程,涵盖镜像详情查看、登录验证/免登录/官方直连三种拉取方式、快速/挂载目录/docker-compose三种部署方式、结果验证步骤,及无法连接、配置持久化等常见问题的解决…

自己的网站怎么做app吗安徽建设相关网站

在国内&#xff0c;我认为Go语言会成为未来的主流&#xff0c;因为国内程序员号称码农&#xff0c;比较适合搬砖&#xff0c;而Rust对心智要求太高了&#xff0c;不适合搬砖。 就个人经验来看&#xff0c;Go语言简单&#xff0c;下限低&#xff0c;没有什么心智成本&#xff0c…

2025年软件外包平台解析:10个不同定位的真实情况

市面上的软件外包平台数量庞大,定位、规则、收费方式差异很大。有的平台主打低门槛,有的平台强调专业筛选,有的则偏向国际市场。对于想要接触外包工作的开发者来说,选对平台比盲目跟风更重要。 本文整理了 10 个具…