第三章、shell中expr命令
expr
用于求取表达式的数值,格式为
expr 表达式
1、表达式说明
- 表达式中使用空格隔开每一项,这和
shell
中数组一样 - 使用反斜杠放在
shell
特定的字符前面,如括号、乘号\(
,\)
,\*
- 对包含空格和其他特殊字符的字符串要用引号括起来
expr
会在stdout
中输出结果。如果为逻辑关系表达式,则结果为真,stdout
为1,否则为0。expr
的exit 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
的子串。如果POSITION
或LENGTH
为负数,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’
# 并且 > 重定向到了 '=' 中