求表达式变量的值。
expr Expression
expr 命令读入 Expression 参数,计算它的值,然后将结果写入到标准输出。
您必须对 Expression 参数应用以下规则:
**。expr $[3+4],同时也支持乘方:expr $[3**4]整数前面可以放一个一元连字符。在内部,整数被当作 32 位,双互补数。
注: expr 命令返回一个 0 来指示一个零值,而不是空字符串。
以下项描述了 Expression 参数的运算符和关键字。需要转义的字符由一个 \ (反斜杠) 放在前面。这些项按照优先权递增的顺序列出,具有相等的优先权的运算符分组在 {} (大括号) 中:
| 表达式 | 说明 |
|---|---|
| Expression1 \| Expression2 | 返回 Expression1 如果它不是空值或者 0 值的话,否则返回 Expression2 。 |
| Expression1 \& Expression2 | 返回 Expression1 如果两个表达式都不是空值或者 0 值,否则返回一个 0 值。 |
| Expression1 { =, \>, \>=, \<, \<=, != } Expression2 | 如果两个表达式都是整数,返回整数比较的结果;否则它返回的是字符串比较的结果。 |
| Expression1 {+, - } Expression2 | 整数值变量的加或者减。 |
| Expression1 { \*, \, % } Expression2 | 整数值变量的乘、除或者提供除法的余数。 |
| Expression1 : Expression2 | 将 Expression1 的运算得到的字符串与 Expression2 的运算结果的正则表达式模式进行比较。正则表达式语法与 ed 命令相同,除了所有的模式固定到字符串的开始之外(也就是说,只有以字符串的第一个字符开始的序列才被正则表达式匹配)。因此 ^ (插入符号) 在这种情况下就不是特殊字符。一般地,匹配运算符返回匹配的字符个数(失败的时候返回 0)。如果模式包含了一个子表达式,也就是:\( Expression \)则会返回包含了实际匹配的字符的字符串。整理顺序可以定义在字符范围内使用的等价类。有关整理顺序和等价类的更多信息,请参阅《AIX V6.1 本地语言支持指南与参考大全》 中的『了解语言环境的环境变量』 。 |
注: 以下字符串变量会超过标准,其行为可能在不同的操作系统中会有不同。这些字符串变量是“不”可移植的。
| 表达式 | 说明 |
|---|---|
| match String1 String2 | 与 Expression1 : Expression2 相同。 |
| length String1 | 返回 String1 的长度。 |
| index String1 String2 | 返回 String1 中包含 String2 中任意字符的第一个位置。 |
| substr String1 StartPosition Length | 返回一个以 StartPosition 的字符开始的在 String1 中的字符串,并且是 Length 长度的字符串。 |
此命令返回以下退出值:
| 值 | 说明 |
|---|---|
| 0 | Expression 参数运算值既不为空也不为 0。 |
| 1 | Expression 参数的计算值或者为空或者为 0。 |
| 2 | Expression 参数无效。 |
| >2 | 发生错误。 |
注: 在 shell 处理完参数后, expr 命令除了利用数值外不能区分运算符和操作数。因此,如果
$a的值是j的话,命令:
xxxxxxxxxxexpr $a = j
就像:
xxxxxxxxxxexpr j = j
在 shell 将所有的参数都传给 expr 命令之后。以下情况也为 true:
xxxxxxxxxxexpr X$a = Xj
要修改一个 shell 变量,请输入:
xxxxxxxxxxCOUNT=`expr $COUNT + 1`
这会加 1到 shell 变量 $COUNT上。 expr 命令以 grave accent 包装,这会导致 shell 将 expr 命令的标准输出替换到 COUNT=命令的标准输出。$COUNT变量使用前必须初始化。
要想得到 $STR shell 变量的长度,请输入:
xxxxxxxxxxLENGTH=`expr $STR : ".*"`
这会将 LENGTH变量设置成由 :(冒号)运算符给出的值。.*(点,星号)模式会对任何字符串从头到尾去匹配,因此冒号运算符给出 $STR变量的长度作为匹配字符的数目。注,.*必须在引号内,来防止 shell 将 *(星号)处理成模式匹配字符。引号不是模式中的一部分。
如果 $STR变量设置成空字符串或者包含了任何空格(空白或者制表键)的话,那么该命令会显示错误消息 expr: syntax error。这是因为 shell 通常不会将空字符串传递给命令。在这种情况下,expr 命令只能看见:
xxxxxxxxxx:.*
shell 还会除去单个的引号。不起作用的原因是因为冒号运算符要求有两个值。此问题可以通过将 shell 变量以双引号括起来解决:
xxxxxxxxxxLENGTH=`expr "$STR" : ".*"`
现在,如果 $STR变量的值为空的话,LENGTH变量被设置成 0 值。通常我们推荐将 shell 变量用双引号括起来。不要将 shell 变量用单引号标记括起来。
要想使用一个字符串的一部分,请输入:
xxxxxxxxxxFLAG=`expr "$FLAG" : "-*\(.*\)"`
只要 $FLAGshell 变量前面有连字符,就会除去连字符。冒号运算符给出 FLAG变量的一部分,该变量由在 ( 和 ) 字符(反斜杠,开括号和反斜杠,闭括号)中间的子表达式匹配。如果您忽略 ( 和 ) 子表达式字符的话,冒号运算符会给出匹配的字符数目。
如果 $FLAG变量设置成 -(连字符),那么该命令会显示一个语法错误消息。这是因为 shell 会将 $FLAG变量的值替换,在运行 expr 命令之前。expr 命令不知道连字符是一个变量的值。它只能理解:
xxxxxxxxxx- : -*\(.*\)
并且它会将第一个连字符解释成减号运算符。要消除这种问题,请使用:
xxxxxxxxxxFLAG=`expr "x$FLAG" : "x-*\(.*\)"`
要想使用 expr 命令在 if 语句中,请输入:
xxxxxxxxxxif expr "$ANSWER" : "[yY]" >/dev/null;then echo ANSWER 以 "y" 或 "Y" 开始fi
如果 $ANSWER变量以 y或 Y开始的话,if 语句的 then部分会执行。如果匹配成功表达式的结果为 1,并且 expr 命令会返回一个为 0 的出口值,此出口值被 if 语句识别成逻辑值 True。如果匹配失败,结果为 0,出口值为 1。
将 expr 命令的标准输出重新定向到 /dev/null 特殊文件,而废弃该表达式的结果。如果您没有对它重新定向,结果就会写到标准输出中,通常是您的工作站显示器。
考虑以下表达式:
xxxxxxxxxxexpr "$STR" = "="
如果 $STR变量有值为 =(等号),那么在 shell 处理完此命令之后,expr 命令会看到表达式:
xxxxxxxxxx= = =
expr 命令将此解释成在一行中的三个等号运算符,并显示一个语法出错消息。一旦 shell 变量的值与 expr 运算符中的一个相同,这种情况就会发生。避免这种问题的方法是,将该表达式写成:
xxxxxxxxxxexpr "x$STR" = "x="
要想返回 $SHELL 环境变量 /usr/bin/ksh 的长度,请输入:
xxxxxxxxxxexpr length $SHELL
显示以下内容:
xxxxxxxxxx12
要想返回 "de" 字符串中的任何一个字符在 "abcdef" 中出现的第一个位置,请输入:
xxxxxxxxxxexpr index abcdef de
显示以下内容:
xxxxxxxxxx4
要想返回 "fd" 字符串的任何字符在 "abcdef" 中出现的第一个位置,请输入:
xxxxxxxxxxexpr index abcdef fd
显示以下内容:
xxxxxxxxxx4
要想返回 "Goodnight Ladies" 字符串中从位置 11 开始的 6 个字符长的字符串,请输入:
xxxxxxxxxxexpr substr "Goodnight Ladies" 11 6
显示以下内容:
xxxxxxxxxxLadies
root@ubuntu:~# expr --help用法:expr EXPRESSION(表示式)或:expr 選項--help 顯示此求助說明並離開--version 顯示版本資訊並離開Print the value of EXPRESSION to standard output. A blank line belowseparates increasing precedence groups. EXPRESSION may be:ARG1 | ARG2 ARG1 if it is neither null nor 0, otherwise ARG2如果ARG1既不为空也不为 0,返回ARG1;否则返回ARG2ARG1 & ARG2 ARG1 if neither argument is null or 0, otherwise 0如果两个表达式都不为空也不为 0,返回ARG1;否则返回0ARG1 < ARG2 ARG1 is less than ARG2ARG1 <= ARG2 ARG1 is less than or equal to ARG2ARG1 = ARG2 ARG1 is equal to ARG2ARG1 != ARG2 ARG1 is unequal to ARG2ARG1 >= ARG2 ARG1 is greater than or equal to ARG2ARG1 > ARG2 ARG1 is greater than ARG2ARG1 + ARG2 arithmetic sum of ARG1 and ARG2ARG1 - ARG2 arithmetic difference of ARG1 and ARG2ARG1 * ARG2 arithmetic product of ARG1 and ARG2ARG1 / ARG2 arithmetic quotient of ARG1 divided by ARG2ARG1 % ARG2 arithmetic remainder of ARG1 divided by ARG2STRING : REGEXP anchored pattern match of REGEXP in STRINGmatch STRING REGEXP same as STRING : REGEXPsubstr STRING POS LENGTH substring of STRING, POS counted from 1index STRING CHARS index in STRING where any CHARS is found, or 0length STRING length of STRING+ TOKEN interpret TOKEN as a string, even if it is akeyword like `match' or an operator like `/'( EXPRESSION ) value of EXPRESSIONBeware that many operators need to be escaped or quoted for shells.Comparisons are arithmetic if both ARGs are numbers, else 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 nullor 0, 2 if EXPRESSION is syntactically invalid, and 3 if an error occurred.