第三章、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’
# 并且 > 重定向到了 '=' 中

浙公网安备 33010602011771号