expr
是一个用于计算表达式并输出结果的命令行工具。支持算术运算、字符串操作、逻辑判断等,常用于 Shell 脚本中。表达式按优先级分组,需注意操作符的转义或引用以避免 Shell 解析冲突。
基本语法
expr EXPRESSION
expr [选项]
选项
选项 | 描述 |
---|---|
--help | 显示帮助信息并退出。 |
--version | 显示版本信息并退出。 |
表达式详解
逻辑运算符
表达式 | 描述 |
---|---|
`ARG1 | ARG2` |
ARG1 & ARG2 | 若 ARG1 和 ARG2 均非 null 或 0 ,返回 ARG1 ,否则返回 0 。 |
比较运算符
表达式 | 描述 |
---|---|
ARG1 < ARG2 | 若 ARG1 小于 ARG2 ,返回 1 ,否则 0 。 |
ARG1 <= ARG2 | 若 ARG1 小于等于 ARG2 ,返回 1 ,否则 0 。 |
ARG1 = ARG2 | 若 ARG1 等于 ARG2 ,返回 1 ,否则 0 。 |
ARG1 != ARG2 | 若 ARG1 不等于 ARG2 ,返回 1 ,否则 0 。 |
ARG1 >= ARG2 | 若 ARG1 大于等于 ARG2 ,返回 1 ,否则 0 。 |
ARG1 > ARG2 | 若 ARG1 大于 ARG2 ,返回 1 ,否则 0 。 |
算术运算符
表达式 | 描述 |
---|---|
ARG1 + ARG2 | 返回 ARG1 和 ARG2 的和。 |
ARG1 - ARG2 | 返回 ARG1 减去 ARG2 的差。 |
ARG1 * ARG2 | 返回 ARG1 和 ARG2 的乘积。 |
ARG1 / ARG2 | 返回 ARG1 除以 ARG2 的商(整数除法)。 |
ARG1 % ARG2 | 返回 ARG1 除以 ARG2 的余数。 |
字符串操作符
表达式 | 描述 |
---|---|
STRING : REGEXP | 检查 REGEXP 是否匹配 STRING 的开头:- 若含 \( ... \) ,返回匹配的子字符串。- 否则返回匹配的字符数或 0 。 |
match STRING REGEXP | 等同于 STRING : REGEXP 。 |
substr STRING POS LENGTH | 返回 STRING 从位置 POS (从 1 开始计数)起的 LENGTH 长度子字符串。 |
index STRING CHARS | 返回 STRING 中首次出现 CHARS 中任意字符的索引(从 1 开始),未找到返回 0 。 |
length STRING | 返回 STRING 的长度。 |
其他操作符
表达式 | 描述 |
---|---|
+ TOKEN | 将 TOKEN 解释为字符串,即使它是一个关键字(如 match )或操作符(如 / )。 |
( EXPRESSION ) | 改变运算顺序,优先计算括号内的表达式。 |
退出状态
状态码 | 含义 |
---|---|
0 | 表达式结果非空且非 0 。 |
1 | 表达式结果为 null 或 0 。 |
2 | 表达式语法错误(如无效操作符或参数不足)。 |
3 | 发生其他错误(如无法打开文件或内存不足)。 |
示例
基本用法
帮助和版本信息
-
显示帮助信息:
expr --help
-
显示版本信息:
expr --version
表达式类型
逻辑运算符
-
或运算(返回第一个非空非零参数):
expr ARG1 \| ARG2
-
与运算(两个参数都非空非零时返回第一个参数):
expr ARG1 \& ARG2
比较运算符
-
小于:
expr ARG1 \< ARG2
-
小于等于:
expr ARG1 \<= ARG2
-
等于:
expr ARG1 = ARG2
-
不等于:
expr ARG1 != ARG2
-
大于等于:
expr ARG1 \>= ARG2
-
大于:
expr ARG1 \> ARG2
算术运算
-
加法:
expr ARG1 + ARG2
-
减法:
expr ARG1 - ARG2
-
乘法(注意需要转义):
expr ARG1 \* ARG2
-
除法:
expr ARG1 / ARG2
-
取模:
expr ARG1 % ARG2
字符串操作
-
正则表达式匹配:
expr STRING : REGEXP # 或 expr match STRING REGEXP
-
提取子字符串:
expr substr STRING 起始位置 长度
-
查找字符位置:
expr index STRING 字符集
-
计算字符串长度:
expr length STRING
特殊语法
-
强制解释为字符串:
expr + TOKEN
-
表达式分组:
expr \( 表达式 \)
使用示例
-
计算算术表达式:
expr 10 + 20 # 输出30
-
字符串长度计算:
expr length "hello" # 输出5
-
提取子字符串:
expr substr "hello world" 2 5 # 输出"ello "
-
正则表达式匹配:
expr "hello world" : 'h.*o' # 输出5(匹配的字符数)
-
逻辑判断:
expr 10 \> 5 \& 20 \< 30 # 输出1(true)
注意事项
-
操作符转义:
- 大多数操作符(如
+
,*
,|
)需用反斜杠\
转义,或用引号包裹,否则会被 Shell 解析。 - 示例:
expr 3 + 5
会出错,需写成expr 3 \+ 5
或expr 3 + 5
(用引号包裹+
)。
- 大多数操作符(如
-
比较类型:
- 若两操作数均为数字,比较为算术比较;否则为字符串比较(按 ASCII 顺序)。
-
模式匹配:
REGEXP
需使用基本正则表达式(BRE),且\( ... \)
定义捕获组。