linux expr 命令
expr命令可以实现数值运算、数值或字符串比较、字符串匹配、字符串提取、字符串长度计算等功能。
它还具有几个特殊功能,判断变量或参数是否为整数、是否为空、是否为0等。
expr 语法
expr 表达式
expr 用法目录
expr length 计算字串长度
该表达式是返回字符串 string的长度,其中string不允许为空,否则将报错,所以可以用来判断变量是否为空。
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr length "xinbiancheng.cn"
15
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr length abcde
5
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr length 123
3
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr length $xxx
expr: syntax error #expr 报错 因为没有$xxx 所以为null 空
[root@iz8vbbxoyfcgyzkxcspg04z test]# if [ $? -ne 0 ];then echo '$xxx is null';fi
$xxx is null #在执行expr 之前需要判断是否为空
expr 四则运算
注意:
expr 命令只能用于整数值计算
expr 运算符左右都有空格,如果没有空格表示是字符串连接
expr 使用乘号时,必须用反斜线屏蔽其特定含义。因为expr 支持正则表达式,而正则表达式*星号是有特殊含义的,所以需要进行转义
expr 不用整数进行计算报错为:expr: non-integer argument
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr 1.2 + 1.3
expr: non-integer argument
expr 没有空格表示是字符串连接
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr 1+2
1+2
expr 正确写法中间加空格
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr 1 + 2
3
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr 6 / 3 #expr 整除
2
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr 6 % 3 #expr 取余
0
expr *乘号 不用 \ 反斜线 或 引号 ' 包裹会报错 expr: syntax error
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr 2 * 2
expr: syntax error
expr *乘号 正确写法,有两种如下所示:
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr 2 \* 2
4
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr 2 "*" 2
4
expr 比较操作
比较操作符< <= = == != >= > 其中""是正则表达式的元字符,且"
这些操作符会首先会将两端的参数转换为数值,如果转换成功,则采用数值比较,如果转换失败,则按照字符集的排序规则进行字符大小比较。
比较的结果若为true,则expr返回1,否则返回0。
[root@iz8vbbxoyfcgyzkxcspg04z test]# a=6
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr $a = 2
0
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr $a = 6
1
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr $a \* 3 = 18
1
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr abc \> ab
1
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr abc \> abcd
0
expr 逻辑运算
逻辑连接符号"&"和"|",这两个符号都需要转义,或使用引号包围
"&"表示如果两个参数都非0,则返回第一个参数,否则返回0。但任意一个参数为空,则expr报错。除非空字符串使用引号包围,则处理方法和0一样。
"|"表示如果第一个参数非0,则返回第一个参数的值,否则返回第二个参数。但如果任意一个参数为空,则expr报错。除非空字符串使用引号包围,则处理方法和0一样。
expr | 或 操作
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr $b '|' 1 #$b变量没有任何赋值,所以为空,则expr报错
expr: syntax error
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr "$b" '|' 1 #空字符串使用引号包围 expr不会报错 当0处理
1
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr abc '|' 0 #expr 第一个参数不为空,返回第一个
abc
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr 0 '|' abc #expr 第二个参数不为空,返回第二个
abc
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr abc '|' cde #expr 第一个参数不为空,返回第一个
abc
expr & 与 操作
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr $b '&' 1 #$b变量没有任何赋值,所以为空,则expr报错
expr: syntax error
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr "$b" '&' 1 #空字符串使用引号包围 expr不会报错 当0处理
0
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr 0 '&' abc
0
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr abc '&' 0
0
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr abc '&' cde #两个参数都是非0,返回第一个参数
abc
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr cde '&' abc #两个参数都是非0,返回第一个参数
cde
expr substr 截取字符串
用法:
expr substr string pos len
该表达式是从string字符串中取出从pos位置开始长度为len的子字符串。如果pos或len为非正整数时,将返回空字符串。
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr substr abcde 2 3
bcd
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr substr abcde 2 4
bcde
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr substr abcde 2 5
bcde
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr substr abcde 2 0 #非正整数返回空字符串
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr substr abcde 2 -1 #非正整数返回空字符串
expr index 返回找到最靠前的字符的位置
用法:
expr index string chars
该表达式是从chars中每一个字符在string字符串中搜索它的位置,找string中最靠前位置。
实例代码:
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr index abcde dec
3
expr 命令将对字符串"dec"逐字符分解,首先分解得到第一个字符d,从abcde中搜索到d的位置为4,再分解得到第二个字符e,该字符在abcde中的位置为5,最后得到的字符是c,该字符在abcde中的位置为3。其中3是最靠前的位置,所以命令返回的结果为3。
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr index 'abcde' c
3
如果chars中的所有字符都不存在于string中,则返回0。
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr index abcde 1
0
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr index abcde f
0
expr + token 特殊字符的用法
expr中有些符号和关键字有特殊意义,如"match"、"index"、"length",如果要让其成为字符,使用该表达式将任意token强制解析为普通字符串。
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr index match m
expr: syntax error
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr index index i
expr: syntax error
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr index length e
expr: syntax error
正确用法 在 关键字 前面空格再加一个+加号连接
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr index + match m
1
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr index + index i
1
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr index + length e
2
expr 正则表达式的用法
如果没有学习正则表达式,有可能不容易看懂,请点击链接学习。
用法:
expr string : REGEX
string代表字符串,REGEX代表正则表达式,如果要输出匹配到的字符串结果,需要使用"\("和"\)",否则返回的将是匹配到的字符串数量。
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr abcde : 'ab\(.*\)'
cde
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr abcde : 'ab\(.\)'
c
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr abcde : 'ab.*'
5
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr abcde : 'ab.'
3
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr abcde : '.*cd*'
4
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr 手机号码是12345678911对吗? : '手机号码是\([0-9]*\)'
12345678911
注意,由于REGEX中隐含了"^",所以使得匹配时都是从string首字符开始的。
[root@iz8vbbxoyfcgyzkxcspg04z test]# expr abcde : 'cd.*'
0
之所以为0,是因为真正的正则表达式是"^cd.*",而abcde不是c开头而是a开头的,所以无法匹配到任何结果。
因此,任何字符串匹配时,都应该从首字符开始。字符串匹配时,会先将两端参数转换为字符格式。