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(未找到)