Linux expr命令详解

expr 是 Linux/Unix 系统中一个经典的外部命令,专门用于在命令行或 Shell 脚本中进行整数运算字符串处理

📝 基础语法与关键注意事项

  • 语法 : expr 表达式
  • 空格 : 操作符和操作数之间必须用空格分隔。
  • 转义 : 操作符 *, (, ), <, > 在 Shell 中有特殊含义,必须用 \ 转义(如 *, , , <, >)。
  • 引号 : 包含空格或特殊字符的字符串建议用双引号括起来。
  • 整数限定 : expr 仅支持整数运算,不处理浮点数。
  • 复杂表达式 : 当表达式包含多个操作符时,需要用反引号 <code></code> 或 $() 将表达式括起来,以将其整体传递给 expr。

bash

复制代码
#反引号(旧式)
复制代码
result=`expr 5 + 3`
复制代码
#美元符号加括号(推荐)
复制代码
result=$(expr 5 + 3)

⚙️ 核心功能与操作符

下表列出了 expr 支持的各类操作符,按运算优先级从低到高排列。

操作符/函数 说明 核心 示例
ARG1 ARG2 逻辑或 如果ARG1既不为空也不为0,则返回ARG1,否则返回ARG2
ARG1 & ARG2 逻辑与 如果ARG1和ARG2都不为空且不为0,则返回ARG1,否则返回0 expr 3 & 5 返回 3 expr 0 & 5 返回 0
ARG1 < ARG2 小于 整数或字符串比较,真返回1,假返回0 expr 3 < 5 返回 1
ARG1 <= ARG2 小于等于 expr 5 <= 5 返回 1
ARG1 = ARG2 等于 expr 5 = 6 返回 0
ARG1 != ARG2 不等于 expr 5 != 5 返回 0
ARG1 >= ARG2 大于等于 expr 5 >= 3 返回 1
ARG1 > ARG2 大于 expr 5 > 5 返回 0
ARG1 + ARG2 加法 整数运算 expr 5 + 3 返回 8
ARG1 - ARG2 减法 expr 10 - 4 返回 6
ARG1 * ARG2 乘法 注意乘法必须转义 expr 5 * 3 返回 15
ARG1 / ARG2 除法 expr 15 / 3 返回 5
ARG1 % ARG2 取余 expr 17 % 5 返回 2
length STRING 计算长度 expr length "hello" 返回 5
substr STRING POS LEN 提取子串 POS从1开始计数 expr substr "hello" 2 3 返回 ell
index STRING CHARS 查找字符位置 返回CHARS中任一字符在STRING中的第一个位置 expr index "hello" "lo" 返回 4(匹配到了l)
STRING : REGEXP 正则匹配 从STRING开头锚定匹配REGEXP并输出匹配部分 见下文详情
match STRING REGEXP 同上 STRING : REGEXP的替代写法 同上

📋 常见用法示例与技巧

1. 算术运算

bash

复制代码
#加减乘除取余
复制代码
expr 5 + 3   #输出8
复制代码
expr 5 \* 3  #输出15,乘号必须转义
复制代码
expr 10 / 3  #输出3(只取整数部分)
复制代码
复制代码
#多级运算,必须对括号转义
复制代码
expr \( 10 + 5 \) \* 3  #输出45
复制代码
复制代码
#与变量结合
复制代码
a=10
复制代码
a=$(expr $a + 5)
复制代码
echo $a  #输出15
2. 字符串操作

bash

复制代码
str="Hello World"
复制代码
复制代码
#获取字符串长度
复制代码
expr length "$str"           #输出11
复制代码
复制代码
#提取子串(位置从1开始)
复制代码
expr substr "$str" 2 4       #输出"ello"
复制代码
复制代码
#查找子串位置
复制代码
expr index "$str" "lo"       #输出4(第一个匹配的字符是'l')
复制代码
expr index "$str" "xyz"      #输出0(未找到)
相关推荐
叶帆10 小时前
【YFIOs】Docker方式部署
运维·docker·容器
小猿姐11 小时前
Clickhouse Kubernetes Operator 实测:哪种方案更适合生产?
运维·数据库·kubernetes
彩色的黑'''11 小时前
[root@localhost ~]#,Linux系统的命令提示符为啥现在变成-bash-4.2#了,哪里设置的
linux·运维·bash
树下水月11 小时前
文件分片上传接口(Easyswoole)被nginx拦截,并返回状态码400和408的抓包排查过程
运维·nginx
源远流长jerry12 小时前
Linux 网络发送机制深度解析:从应用到网线
linux·服务器·网络·网络协议·tcp/ip
南境十里·墨染春水12 小时前
linux学习进展 shell编程
linux·运维·学习
goyeer13 小时前
【ITIL4】32服务实践 - 问题管理(Problem Management)
linux·运维·服务器·企业数字化·it管理·itil·it治理
怀旧,13 小时前
【Linux网络编程】8. 网络层协议 IP
linux·网络·tcp/ip
RH23121113 小时前
2026.5.12 Linux
java·linux·数据结构