expr(expression 的缩写)是 Linux/Unix 系统中一款经典的命令行工具,主要用于整数运算、字符串处理和逻辑判断。它通过命令行参数接收表达式,计算并输出结果,常被用于 shell 脚本中处理简单的数值和字符串操作。本文将从基础语法到高级用法,全面解析 expr 命令的功能与实践。
expr 的核心语法非常简单,通过空格分隔表达式的各个元素:
其中,“表达式” 可以是整数运算(如 1 + 2)、字符串操作(如 length "hello")或逻辑判断(如 5 > 3)。
- 无交互模式:所有操作通过命令行参数完成,无交互式输入;
- 返回值规则:
- 计算成功时,输出表达式结果(整数或字符串);
- 计算失败时(如语法错误、运算不成立),输出空值,且返回状态码非 0(可通过
$? 查看);
- 适用场景:shell 脚本中处理简单运算、字符串长度计算、模式匹配等轻量任务。
expr 支持基本的整数算术运算,包括加、减、乘、除、取余,运算符号前后必须有空格(否则会被视为字符串)。
注意:* 在 shell 中是通配符,必须用反斜杠 \ 转义:
仅支持整数除法,结果向下取整(截断小数部分):
返回除法的余数(结果符号与被除数一致):
expr 提供了简单的字符串处理能力,包括计算长度、查找字符位置、模式匹配等,适合轻量文本处理场景。
expr index "字符串" "字符集":返回 “字符集” 中任意字符在 “字符串” 中首次出现的位置(从 1 开始计数,无匹配则返回 0)。
注意:index 匹配的是 “字符集中的任意单个字符”,而非字符串整体。
用于判断字符串是否匹配指定模式(支持基础正则表达式),返回匹配的长度(无匹配则返回 0)。两种语法等价:
expr match "字符串" "模式"
expr "字符串" : "模式"
说明:模式中的 \(` 和 `\) 用于捕获匹配的子串(仅返回捕获部分的长度),无捕获时返回整个匹配的长度。
expr substr "字符串" 起始位置 长度:从 “起始位置”(从 1 开始)提取指定 “长度” 的子串。
expr substr "hello world" 1 5
expr 可进行整数或字符串的比较运算,返回1(真) 或0(假),常与 shell 条件语句(如 if)结合使用。
注意:< 和 > 在 shell 中是重定向符号,必须用反斜杠 \ 转义:
字符串比较仅支持 =(等于)和 !=(不等于),按字符 ASCII 码逐位比较:
利用模式匹配判断字符串是否全为数字:
#!/bin/bash
read -p "请输入一个数字:" input
#!/bin/bash
file="document.txt"
- 运算符前后必须有空格:
expr 1+2 会被视为字符串 “1+2”,返回错误;正确写法是 expr 1 + 2。
- 特殊字符需转义:
*、(、)、<、> 等在 shell 中有特殊含义,必须用 \ 转义(如 \*、\<)。
- 字符串含空格需加引号:如
expr length "hello world",不加引号会被解析为多个参数,导致错误。
- 不支持浮点数运算:expr 仅能处理整数,浮点数计算需用
bc 或 awk(如 echo "2.5 + 3.5" | bc)。
- 正则表达式支持有限:仅支持基础正则(如
*、+、[]),不支持扩展正则(如 ?、() 分组)。
- 性能较低:复杂运算或大量数据处理时,效率远低于
awk 或 Python 脚本。