linux expr 命令

Linux 命令大全

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 比较操作

比较操作符< <= = == != >= > 其中"<"和">"是正则表达式的元字符,且"<"会被shell解析为重定向符号,所以需要转义或用引号包围。

这些操作符会首先会将两端的参数转换为数值,如果转换成功,则采用数值比较,如果转换失败,则按照字符集的排序规则进行字符大小比较。

比较的结果若为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开头的,所以无法匹配到任何结果。

因此,任何字符串匹配时,都应该从首字符开始。字符串匹配时,会先将两端参数转换为字符格式。

Linux 命令大全