Linux系统之expr详解

expr 是一个用于计算表达式并输出结果的命令行工具。支持算术运算、字符串操作、逻辑判断等,常用于 Shell 脚本中。表达式按优先级分组,需注意操作符的转义或引用以避免 Shell 解析冲突。

基本语法

expr EXPRESSION
expr [选项]

选项

选项描述
--help显示帮助信息并退出。
--version显示版本信息并退出。

表达式详解

逻辑运算符

表达式描述
`ARG1ARG2`
ARG1 & ARG2ARG1ARG2 均非 null0,返回 ARG1,否则返回 0

比较运算符

表达式描述
ARG1 < ARG2ARG1 小于 ARG2,返回 1,否则 0
ARG1 <= ARG2ARG1 小于等于 ARG2,返回 1,否则 0
ARG1 = ARG2ARG1 等于 ARG2,返回 1,否则 0
ARG1 != ARG2ARG1 不等于 ARG2,返回 1,否则 0
ARG1 >= ARG2ARG1 大于等于 ARG2,返回 1,否则 0
ARG1 > ARG2ARG1 大于 ARG2,返回 1,否则 0

算术运算符

表达式描述
ARG1 + ARG2返回 ARG1ARG2 的和。
ARG1 - ARG2返回 ARG1 减去 ARG2 的差。
ARG1 * ARG2返回 ARG1ARG2 的乘积。
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 的长度。

其他操作符

表达式描述
+ TOKENTOKEN 解释为字符串,即使它是一个关键字(如 match)或操作符(如 /)。
( EXPRESSION )改变运算顺序,优先计算括号内的表达式。

退出状态

状态码含义
0表达式结果非空且非 0
1表达式结果为 null0
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 \( 表达式 \)
    

使用示例

  1. 计算算术表达式:

    expr 10 + 20  # 输出30
    
  2. 字符串长度计算:

    expr length "hello"  # 输出5
    
  3. 提取子字符串:

    expr substr "hello world" 2 5  # 输出"ello "
    
  4. 正则表达式匹配:

    expr "hello world" : 'h.*o'  # 输出5(匹配的字符数)
    
  5. 逻辑判断:

    expr 10 \> 5 \& 20 \< 30  # 输出1(true)
    

注意事项

  1. 操作符转义

    • 大多数操作符(如 +, *, |)需用反斜杠 \ 转义,或用引号包裹,否则会被 Shell 解析。
    • 示例:expr 3 + 5 会出错,需写成 expr 3 \+ 5expr 3 + 5(用引号包裹 +)。
  2. 比较类型

    • 若两操作数均为数字,比较为算术比较;否则为字符串比较(按 ASCII 顺序)。
  3. 模式匹配

    • REGEXP 需使用基本正则表达式(BRE),且 \( ... \) 定义捕获组。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值