「expr(1)」-

评估表达式

命令语法格式

expr EXPRESSION

expr OPTION

命令描述

命令expr评估表达式EXPRESSION,并将结果写入标准输出。表达式的每个标记(token)都必须是单独的参数。

操作数是整数或字符串。整数由一个或多个十进制数字组成,并带有可选的前导减号(’-‘)表示负数。expr将出现在操作数位置的任何内容转换为整数或字符串,具体取决于应用于此的操作。

对于expr本身,字符串不需要进行引用,但是如果字符串中包含对Shell有特殊含义的字符,那么可能需要通过引用来保护它们,例如空格。然而,无论是否引用它,字符串操作数中都不应该是圆括号或任何expr的运算符(如,+)。因此,你无法只能通过将其引用到shell来安全地将任意字符串$str传递给expr。解决这个问题的一种方法是使用GNU扩展“+”(例如+ “$str” = foo);更具有可移植性的方法是使用“$ str”,并调整表达式的其余部分以考虑前导空格(例如“$ str”=“foo”)。

不要将一个负整数或一个带有前导’-‘的字符串作为expr的第一个参数,因为它可能会被解释为一个选项;这可以通过括号来避免。另外,可移植脚本不应该使用恰好是整数形式的字符串操作数;这可以通过插入如上所述的前导空格来解决。

运算符可以作为中缀符号或前缀关键字。圆括号可以用于通常的分组手段。但是,括号和许多运算符可能需要引用,以此来避免Shell解析它们。

当支持GNU MP库时,expr使用任意精度算法;否则,它使用本地算术类型,但可能由于算术溢出而失败。

命令支持的选项及含义

命令expr主要的用途是计算表达式,所以支持的选项比较少,也与计算表达式无关。

表达式

本部分介绍的是expr命令中的EXPRESSION参数的语法。分为三部分:字符串表达式、数字表达式、关系运算符。

字符串表达式

expr支持模式匹配和其他字符串运算符。这些比数字和关系运算符具有更高的优先级(在下一节中)。

string : regex
执行模式匹配。参数被转换为字符串,第二个参数被视为正则表达式(BRE,如GNU的grep命令),并带有一个隐含的脱字符(^)前缀。然后,用第一个参数与这个正则表达式匹配。

如果匹配成功,并且正则表达式中使用了’\(‘和’\)’,则:表达式返回匹配子表达式的字符串部分;否则,它返回匹配的字符数。如果匹配失败,如果在正则表达式中使用’\(‘和’\)’,则:表达式返回空字符串,否则返回0。

只有第一对’\(…\)’与返回值有关;其他仅对正则表达式运算符进行分组才有意义。

在正则表达式中,\+,\?和\|是分别匹配一个或多个、零个或一个、分离的或运算,这是正则表达式的内容,这里不再过多的赘述。SunOS和其他expr将它们视为常规字符。(POSIX允许任一行为。)有关正则表达式语法的详细信息,请参阅正则表达式库中的正则表达式库

match string regex
等同于使用‘string : regex’

substr string position length
返回字符串string的第position个开始,长度为length的子串。如果position或length为负数、零、非数字,则返回空字符串。

index string charset
其中,charset可以是多个字符。expr会返在charset中第一个出现在string中的字符的位置。如果在string中没有找到charset中的字符,则返回0。

length string
返回字符串的长度。

+ token
将token解释为字符串,即使它是关键字(像match)或是运算符(像/这样的)。这使得测试expr length + “$x”expr + “$x” : ‘.*/\(.\)’成为可能,并且即使$x的值是/或index也不会出现语法错误。

这个运算符是一个GNU扩展。可移植Shell脚本应该使用” $token” : ‘ \(.*\)’,而不是+ “$token”

注意事项
要将expr解释的关键字设置为字符串,必须进行引用。

数字表达式

expr支持通常的数字运算符,按照增加的优先顺序。这些数字运算符的优先级低于字符串运算符,并且优先级高于关系运算符(下一节)。

+ –
加与减。他们的参数会被转化为整型数值;如果无法转换则返回错误。

/ % *
乘法、除法、求余。他们的参数会被转化为整型数值;如果无法转换则返回错误。

关系运算符

expr支持逻辑连接词和关系运算符。这些的优先级低于字符串操作和数字运算符。下面介绍的顺序是按照优先级从低到高进行的:

ARG1 | ARG2
如果第一个参数不为“0”也不为“null”,则返回它的第一个参数;否则返回它的第二个参数,否则返回0。如果它的第一个参数既不为“0”也不为“null”,则它不会再计算第二个参数。

ARG1 & ARG2
如果两个参数都不为“null”或“0”,则返回它的第一个参数,否则返回“0”。如果它的第一个参数为“null”或“0”,则不计算它的第二个参数。

< <= = == != >= >
比较参数,如果关系为真则返回“1”,否则返回0。“==”是“=”的同义词。expr首先尝试将这两个参数转换为整数并进行数字比较;如果其中的转换失败,则使用由LC_COLLATE语言环境指定的字符整理序列进行字典式比较。

其他选项

–help
显示帮助手册并退出。

–version
显示版本号并退出。

退出状态

0 表达式既不为空也不为0。

1 表达式为空或者为0。

2 表达式无效。

3 发生了内部错误。比如,数字溢出。

使用示例

下面几个示例演示了expr的用法,包括对Shell元字符的引用。

将Shell变量foo加1:

# foo=$(expr $foo + 1)

打印$fname变量中存储的文件名中的非目录部分:

# expr $fname : ‘.*/\(.*\)’ ‘|’ $fname

下面的示例演示了做为运算符的\+:

# expr abc : ‘a\(.\)c’

b

# expr index abcdef cz

3

# expr index index a

expr: syntax error

# expr index + index a

0

相关手册

查看在线手册:http://www.gnu.org/software/coreutils/expr

查看info手册:info ‘(coreutils) expr invocation’

参考文献

  • man 1 expr, version GNU coreutils 8.28

更新日志

  • 06/22/2018 创建文章