Go to main content

手册页部分 1:用户命令

退出打印视图

更新时间: 2022年7月27日 星期三
 
 

expr(1)

名称

expr - 计算作为表达式的参数

用法概要

/usr/bin/expr argument...
/usr/xpg4/bin/expr argument...
/usr/xpg6/bin/expr argument...

描述

/usr/bin/expr, /usr/xpg4/bin/expr

expr 实用程序将计算该表达式,并将结果写入标准输出。写入字符 0 表示值为零,不写入任何内容表示字符串为空。

/usr/xpg6/bin/expr

expr 实用程序将计算该表达式,并将结果写入标准输出,其后跟有换行符。如果 expr 处理未生成任何结果,则将换行符写入标准输出。

操作数

argument 操作数作为表达式进行计算。表达式的各项之间必须以空格分隔。shell 的特殊字符必须进行转义(请参见 sh(1))。包含空格或其他特殊字符的字符串必须括在引号中。表达式的长度限制为 LINE_MAX(2048 个字符)。

下面列出了运算符和关键字。列表按照优先级递增顺序进行排列,优先级相同的操作符将归为一组,置于 { } 符号中。所有运算符从左向右执行运算。

expr | expr

如果既不是 NULL 也不是 0,则返回第一个 expr 的计算结果;否则,如果不是 NULL,则返回第二个 expr 的计算结果;否则,返回0

expr & expr

如果 expr 既不是 NULL 也不是 0,则返回第一个 expr,否则返回 0

expr { =, >, >=, <, <=, != } expr

如果所有参数均为整数,则返回整数比较的结果,否则使用语言环境特有的合并序列返回字符串比较的结果。如果指定的关系为 TRUE,则每个比较的结果为 1;如果指定的关系为 FALSE,则每个比较的结果为0

expr { +, - } expr

整数值参数的加或减。

expr { *, /, % } expr

整数值参数的乘、除或余数。

expr : expr

匹配运算符 :(冒号)将第一个参数与第二个参数进行比较,除非所有模式均固定在字符串的开头,否则必须按照国际化基本正则表达式 (basic regular expression, BRE) 进行匹配。也就是说,只有从字符串第一个字符开始的序列才可按照正则表达式进行匹配。请参见 regex(7) 和“附注”部分。通常,/usr/bin/expr 匹配运算符将返回匹配的字节数,/usr/xpg4/bin/expr 匹配运算符将返回匹配的字符数(匹配失败返回 0)。如果第二个参数至少包含一个 BRE 子表达式 [\(...\)],则匹配运算符将返回与 \1 相对应的字符串。

integer

仅由一元减号(可选)后跟数字组成的参数。

string

无法识别为 integer 参数或表达式运算符符号之一的字符串参数。

The following four operators: index, length, match, and substr, are all at the same precedence:

index string character-list

报告 string 中的第一个字节(从 1 开始计数),其中 character-list 中的字节与 string 中的字节匹配。如果字符串中未出现 character-list 中的任何字节,则返回 0

length string

返回 string 的长度(即字节数)。终止空字符不包含在该计数中。

match string regular-expression

expr : expr 匹配运算符含义相同。

substr string integer-1 integer-2

从开始于 integer-1 位置且长度为 integer-2 字节的字符串(从 1 开始计数)中提取字节序列。If integer-1 has a value greater than the number of bytes in string, expr returns a null string.如果尝试提取的字节数大于字符串中的字节数,则 expr 将返回字符串中其余的所有字节。如果 integer-1integer-2 为负值,则会产生意外的结果。

示例

示例 1 将 shell 变量与整数相加

将 shell 变量 a 加 1:

example$ a=`expr  $a  +  1`
示例 2 返回路径名称段

以下示例模拟了 basename(1),返回路径名 $a 的最后一段。For $a equal to either /usr/abc/file or just file, the example returns file.(请注意 / 单独作为参数的情况:expr 将其视为除法运算符。See NOTES below.)

example$ expr $a : '.*/\(.*\)' \| $a
示例 3 使用 // 字符简化表达式

此处为上一个示例的更佳版本。添加 // 字符将消除有关除法运算符的歧义并简化整个表达式。

example$ expr //$a : '.*/\(.*\)'

/usr/bin/expr

示例 4 返回变量中的字节数
example$ expr "$VAR" : '.*'

/usr/xpg4/bin/expr

示例 5 返回变量中的字符数
example$ expr "$VAR" : '.*'

环境变量

See environ(7) for descriptions of the following environment variables that affect the execution of expr: LANG, LC_ALL, LC_COLLATE, LC_CTYPE, LC_MESSAGES, and NLSPATH.

退出状态

作为表达式计算的副作用,expr 将返回以下退出值:

0

如果表达式既不是 NULL 也不是 0

1

如果表达式为 NULL 或 0

2

For invalid expressions.

> 2

出现错误。

属性

有关下列属性的说明,请参见 attributes(7)

属性类型
属性值
可用性
system/core-os
CSI
Enabled(已启用)。请参见“附注”部分。
接口稳定性
请参见下文。
标准
请参见 standards(7)

The match, substr, length, and index operators are Uncommitted.其他内容为 "Committed"(已确定)。

另请参见

basename(1), echo(1), ed(1), sh(1), intro(3), attributes(7), environ(7), regex(7), standards(7)

诊断

syntax error

运算符和操作数错误。

non-numeric argument

尝试对此字符串执行算术计算。

附注

未启用 CSI 的运算符

以下三个运算符未启用 CSI。这些运算符在 /usr/xpg4/bin/expr/usr/xpg6/bin/expr 中也不可用:


index string character-list

length string

substr string integer-1 integer-2

参数经过 shell 处理之后,除非根据值,否则 expr 无法区别运算符和操作数。如果 $a=,则命令:

example$ expr $a = '='

类似如下:

example$ expr = = =

参数传递给 expr(它们均被视为 = 运算符)。以下表达式有效:

example$ expr X$a = X=

正则表达式

不同于以前的某些版本,expr 对所有系统提供的语言环境均使用国际化基本正则表达式。regex(7) 手册中对国际化正则表达式进行了说明。

其他版本中的运算符优先顺序

Solaris 的早期发行版中具有 /usr/ucb/expr 命令,该命令的运算符优先顺序不同于此处所述的 expr 命令。另外,/usr/gnu/bin/expr 命令具有自己专属的运算符优先顺序。