expr (将参数作为表达式求值)

rose1 发表于 2020-09-09 09:08
浏览次数:
在手机上阅读

在类似Unix的操作系统上,expr命令将参数作为表达式求值。 本文档介绍了expr的GNU / Linux版本。

查看英文版

目录

1 expr 运行系统环境

2 expr 语法

3 expr 例子

expr 运行系统环境

Linux

expr 语法

expr EXPRESSION
expr OPTION

选件

--help 显示帮助消息并退出。
--version 显示版本信息并退出。

表达方式

expr将EXPRESSION的值输出到标准输出。下面的空白行将增加的优先级组分开。

表达式可能是:

ARG1 | ARG2 如果ARG1既不为null也不为0,则为ARG2。
ARG1 & ARG2 如果两个参数都不为null或0,则为ARG1,否则为0。
ARG1 < ARG2 ARG1小于ARG2。
ARG1 <= ARG2 ARG1小于或等于ARG2。
ARG1 = ARG2 ARG1等于ARG2。
ARG1 != ARG2 ARG1不等于ARG2。
ARG1 >= ARG2 ARG1大于或等于ARG2。
ARG1 > ARG2 ARG1大于ARG2。
ARG1 + ARG2 ARG1和ARG2的算术和。
ARG1 - ARG2 ARG1和ARG2的算术差。
ARG1 * ARG2 ARG1和ARG2的算术积。
ARG1 / ARG2 ARG1的算术商除以ARG2。
ARG1 % ARG2 ARG1的算术余数除以ARG2。
STRING : REGEXP 正则表达式 REGEXP在STRING中的锚模式匹配。
匹配STRING REGEXP 与STRING : REGEXP相同。
小于STRING POSLENGTH 子串的STRING,POS从1计数。
索引 STRING CHARS 找到任何CHARS的STRING中的索引,或者0。
长度STRING 长度:STRING。
+ TOKEN 将TOKEN解释为字符串,即使它是诸如match的关键字或类似于/的运算符。
表达 EXPRESSION的价值。

使用注意事项

  • 请注意,许多操作符需要转义或引用以由shell正确解释。
  • 如果两个ARG都是数字,则比较是算术运算,否则比较是按字典顺序。
  • 模式匹配返回\(和\)或null 之间匹配的字符串;如果不使用\(和\),则它们返回匹配的字符数或0。
  • 如果EXPRESSION既不为null也不为0,则退出状态为0;如果EXPRESSION为null或0,则退出状态为1;如果EXPRESSION在语法上无效,则为2;如果发生错误,则为3。
expr EXPRESSION
expr OPTION

Options

--help Display a help message and exit.
--version Display version information and exit.

Expressions

expr prints the value of EXPRESSION to standard output. A blank line below separates increasing precedence groups.

EXPRESSION may be:

ARG1 | ARG2 ARG1 if it is neither null nor 0, otherwise ARG2.
ARG1 & ARG2 ARG1 if neither argument is null or 0, otherwise 0.
ARG1 < ARG2 ARG1 is less than ARG2.
ARG1 <= ARG2 ARG1 is less than or equal to ARG2.
ARG1 = ARG2 ARG1 is equal to ARG2.
ARG1 != ARG2 ARG1 is unequal to ARG2.
ARG1 >= ARG2 ARG1 is greater than or equal to ARG2.
ARG1 > ARG2 ARG1 is greater than ARG2.
ARG1 + ARG2 arithmetic sum of ARG1 and ARG2.
ARG1 - ARG2 arithmetic difference of ARG1 and ARG2.
ARG1 * ARG2 arithmetic product of ARG1 and ARG2.
ARG1 / ARG2 arithmetic quotient of ARG1 divided by ARG2.
ARG1 % ARG2 arithmetic remainder of ARG1 divided by ARG2.
STRING : REGEXP anchored pattern match of regular expression REGEXP in STRING.
match STRING REGEXP same as STRING : REGEXP.
substr STRING POSLENGTH substring of STRING, POS counted from 1.
index STRING CHARS index in STRING where any CHARS is found, or 0.
length STRING length of STRING.
+ TOKEN interpret TOKEN as a string, even if it is a keyword like 'match' or an operator like '/'.
( EXPRESSION ) value of EXPRESSION.

Notes About Usage

  • Be aware that many operators need to be escaped or quoted to be interpreted correctly by shells.
  • Comparisons are arithmetic if both ARGs are numbers, otherwise the comparisons are lexicographical.
  • Pattern matches return the string matched between \( and \) or null; if \( and \) are not used, they return the number of characters matched or 0.
  • Exit status is 0 if EXPRESSION is neither null nor 0, 1 if EXPRESSION is null or 0, 2 if EXPRESSION is syntactically invalid, and 3 if an error occurred.

查看英文版

查看中文版

expr 例子

expr text : '.*'

执行正则表达式匹配。冒号后的正则表达式与冒号前的文本匹配。返回的输出是匹配的字符数。在这里,正则表达式'。*'表示“任意数量的任何字符”,因此结果为:

4
expr text : tex

返回冒号后的正则表达式中出现在冒号之前的文本中的字符数。在这里,正则表达式'tex'表示“恰好是连续字符t,ex ”,因此输出为:

3
expr text : '\(.*\)'

在这里,正则表达式'\(。* \)'表示“与模式。*匹配的实际文本(无论在括号之间出现什么,都用反斜杠转义),其本身表示任意数量的任何字符。” 与文本text匹配,这将完全返回字符串:

text
expr 5 = 5

如果表达式相等,则返回1(true),否则,返回0(false)。在这里,值55相等,因此相等,因此输出将是:

1
expr '5' = '5'

在这里,将比较两个字符串的等效性。如果字符串完全匹配(逐字符),则结果将为1(真)。否则,结果将为0。在这里,结果是:

1
expr 5 \> 10

如果5小于10,则结果为1(真),否则为0。“小于”符号(“ < ”)前面带有反斜杠(“ \ ”),以防止其受到外壳程序的攻击,否则会将其解释为重定向操作符。在这个例子中,5是不大于10,所以输出是:

0
expr 5 \!= 5

就像=运算符测试等效性一样,=运算符测试非等效性。如果两个测试值不相等,则结果为true(1),否则结果为false(0)。5等于5,所以结果为假:

0
expr 5 \!= "5"

“等效”与“平等”不同。5是一个数字,而“ 5”是一个字符串,因此从技术上讲它们不是“等于”,但是expr认为它们是等效的,因为它读取字符串的内容,看到它是一个数字,并使用该数字的值在比较中。因此,值5等效于包含数字“ 5”的字符串。因此,这里的答案是错误的。它们不是 非等效的:

0

下一个示例将通过一系列命令展示如何使用expr来递增变量的值。

如果我们定义一个名为count的变量,则将其设置为零:

count=0

...我们可以使用echo命令输出该变量的值:

echo $count
0

...现在我们可以通过将其设置为expr评估的值来增加它,该评估返回变量的值加一个:

count=`expr $count + 1`

...然后我们可以使用另一个回显检查更新后的值:

echo $count
1
expr text : '.*'

Performs a regular expression match. The regular expression after the colon is matched to the text before the colon. The returned output is the number of characters that matched. Here, the regular expression '.*' represents "any number of any character", therefore the result is:

4
expr text : tex

Returns the number of characters from the regular expression after the colon which appear in the text before the colon. Here, the regular expression 'tex' represents "exactly the consecutive characters te, and x", so the output would be:

3
expr text : '\(.*\)'

Here, the regular expression '\(.*\)' represents "The actual text (whatever appears in between the parentheses, which are escaped with backslashes) which matches the pattern .*, which itself represents any number of any character." Matched against the text text, this returns the string exactly:

text
expr 5 = 5

Returns 1 (true) if the expressions are equivalent, or 0 (false) if they are not. Here, the values 5 and 5 are equal, and therefore equivalent, so the output will be:

1
expr '5' = '5'

Here, two strings are being compared for equivalence. If the strings match exactly, character-for-character, the result will be 1 (true). Otherwise, the result will be 0. Here, the result is:

1
expr 5 \> 10

Here, the result is 1 (true) if 5 is less than 10, otherwise the result is 0. The "less than" symbol ("<") is preceded by a backslash ("\") to protect it from the shell, which would otherwise interpret it as a redirectionoperator. In this example, 5 is not greater than 10, so the output is:

0
expr 5 \!= 5

Just as the = operator tests for equivalence, the != operator tests for non-equivalence. If the two values being tested are not equivalent, the result is true (1), otherwise the result is false (0). 5 is equivalent to 5, so the result is false:

0
expr 5 \!= "5"

"Equivalence" is not the same as "equality". 5 is a number, and "5" is a string, so technically they are not "equal," but expr considers them equivalent because it reads the string for its contents, sees that it is a number, and uses the value of that number in the comparison. So the value 5 is equivalent to a string containing the number "5". Therefore the answer here is false; they are not non-equivalent:

0

This next example will show, in a series of commands, how expr can be used to increment the value of a variable.

If we define a variable named count, setting it to zero:

count=0

...we can output the value of that variable with the echo command:

echo $count
0

...now we can increment it by setting it to the value of an expr evaluation, which returns the value of the variable, plus one:

count=`expr $count + 1`

...and we can check the updated value with another echo:

echo $count
1

查看英文版

查看中文版

其他命令行

echo | edit | eject | elm | enable | env | ex | exit | expand |

如此好文,分享给朋友