第三章、shell中expr命令

expr用于求取表达式的数值,格式为

expr 表达式

1、表达式说明

  • 表达式中使用空格隔开每一项,这和 shell 中数组一样
  • 使用反斜杠放在shell特定的字符前面,如括号、乘号 \(, \), \*
  • 对包含空格和其他特殊字符的字符串要用引号括起来
  • expr会在stdout中输出结果。如果为逻辑关系表达式,则结果为真,stdout为1,否则为0。
  • exprexit code:如果为逻辑关系表达式,则结果为真,exit code为0,否则为1。

往往我们只是关心 expr stdout 的结果,可以直接 echo 输出。

2、字符串表达式

  • length STRING
    返回 字符串STRING的长度
  • index STRING CHARSET
    CHARSET任意单个字符STRING中最前面的字符位置,下标从1开始。如果STRING中完全不存在CHARSET中的字符,则返回0。
  • substr STRING POSITION LENGTH
    返回STRING字符串中从 POSITION 开始,长度最大LENGTH 的子串。如果POSITIONLENGTH为负数,0或者非数值,则返回空字符串。下标从1开始,这也可以直接 ${STRING:start:len},但是后一种方案下标从0开始

示例

str='Hello Acwing!'
echo $(expr length $str)  # 报错,因为未加单/双引号,Acwing 被认为是命令而无法识别。
echo $(expr length "$str")   # 13

echo `expr index "${str}" "o1K"`   # 5                          
echo `expr index "${str}" "o1KH"`  # 1                                                                                  
echo `expr index "${str}" "1"`     # 0 

echo `expr substr "${str}" 2 4`    # ello
echo `expr substr "${str}" 2 20`   # ello Acwing!  其实这是取不到20 的

3、整数表达式

expr支持普通的算术操作,算术表达式优先级低于字符串表达式,高于逻辑关系表达式。

  • + -
    加减运算。两端参数会转换为整数,如果转换失败则报错。
  • * / %
    乘,除,取模运算。两端参数会转换为整数,如果转换失败则报错。其中*需要反斜杠转义
  • ( )
    可以该表优先级,但需要反斜杠转义
#! /bin/bash


a=15
b=4

# + -
echo `expr $a + $b`  # 19
echo `expr $a - $b`  # 11
echo `expr $a + 14 - 9 + $b`  # 24

# * / %
echo `expr $a \* $b`  # 60
echo `expr $a / $b`   # 3
echo `expr $a % $b`   # 3
echo `expr 3 \* 15 % 12 / 3 \* 5`  # 15


# ( )
echo $(expr 35 \* \( 7 + 9 \) / 5)        # 35 * (7 + 9) / 5 = 112
echo `expr 35 \* \( \( 7 + 9 \) / 5 \)`   # 35 * ((7 + 9) / 5) = 105

4、逻辑关系表达式

  • |
    如果第一个参数非空且非0,则返回第一个参数的值,否则返回第二个参数的值,但要求第二个参数的值也是非空或非0,否则返回0。如果第一个参数是非空或非0时,不会计算第二个参数。

  • &
    如果两个参数都非空且非0,则返回第一个参数,否则返回0。如果第一个参为0或为空,则不会计算第二个参数。

  • < <= = == != >= >
    比较两端的参数,如果为true,则返回1,否则返回0。”==”是”=”的同义词。”expr”首先尝试将两端参数转换为整数,并做算术比较,如果转换失败,则按字符集排序规则做字符比较

  • ()
    可以该表优先级,但需要反斜杠转义

#! /bin/bash


a=5
b=8
echo `expr $a \& $b`  # 5
echo `expr 10 \& 0`   # 0
echo `expr 0 \& 10`   # 0


echo `expr $a \| $b`  # 5
echo `expr 0 \| 5`    # 5
echo `expr 0 \| ''`   # 0


echo `expr 5 == 8`    # 0
echo `expr 8 == 8`    # 1
echo `expr 8 \>= 8`   # 1
echo `expr 8 \>\= 8`   # 1
echo `expr 8 '>=' 8`  # 1
echo `expr 8 \>\= 8`    # expr: syntax error: unexpected argument ‘8’
                      # 并且 > 重定向到了 '=' 中

5、参考链接

强烈推荐 Y 总的 Linux 基础课

posted @ 2022-07-04 17:42  lucky_light  阅读(366)  评论(0编辑  收藏  举报