expr 命令

用途

求表达式变量的值。

语法

雷布尔 表达式

描述

expr 命令读入 Expression 参数,计算它的值,然后将结果写入到标准输出。

您必须对 Expression 参数应用以下规则:

  • 用空格分隔每个项。
  • 在 shell 的特殊字符前加上 \ (反斜杠)。
  • 将包含空格或其他特殊字符的字符串括起来。

整数前面可以放一个一元连字符。 在内部,整数被当作 32 位,双互补数。

注: 雷布尔 命令将返回 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 \)

则会返回包含了实际匹配的字符的字符串。

整理顺序可以定义在字符范围内使用的等价类。 请参阅 全球化指南和参考 中的 "了解语言环境变量" ,以获取有关整理序列和等价类的更多信息。

注: 以下字符串参数是超出标准的扩展,并且行为可能在各个操作系统之间不同。 这些字符串变量是“不”可移植的。

描述
匹配 String1 String2 Expression1 : Expression2 相同。
长度 String1 返回 String1 的长度。
索引 String1 String2 返回 String1 中包含 String2 中任意字符的第一个位置。
substr String1 StartPosition 长度                        返回一个以 StartPosition 的字符开始的在 String1 中的字符串,并且是 Length 长度的字符串。

退出状态

本命令返回以下退出值:

描述
重大安全事件数量 Expression 参数运算值既不为空也不为 0。
第 1 年 Expression 参数的计算值或者为空或者为 0。
2 Expression 参数无效。
>2 发生错误。

注: 在由 shell 进行参数处理之后, 雷布尔 命令不能区分运算符和操作数,除非是值。 因此,如果值为$aj,命令:

expr $a = j

就像:

expr j = j

在 shell 将所有的参数都传给 expr 命令之后。 以下情况也为 true:

expr X$a = Xj

示例

  1. 要修改 shell 变量,请输入:
    COUNT=`expr $COUNT + 1`
    这将添加1到 shell 变量$COUNT 雷布尔 命令括在严重重音符中,这会导致 shell 将 雷布尔 命令的标准输出替换到COUNT=指令返回给FTP客户的IP地址。 该$COUNT变量必须在使用前初始化。
  2. 要查找 $STR shell 变量的长度,请输入:
    LENGTH=`expr $STR : ".*"`
    这将设置LENGTH变量为: (冒号) 运算符给定的值。 模式。* (点,星号) 与从头到尾的任何字符串匹配,因此冒号运算符给出了$STR变量 (作为匹配的字符数)。 请注意:.*必须括在引号内,以防止 shell 将 * (星号) 作为模式匹配字符处理。 引号不是模式中的一部分。

    如果$STR变量设置为空字符串或包含任何空格 (空白或制表符) ,那么该命令将显示错误消息expr: syntax error。发生这种情况是因为 shell 通常不会将空字符串传递到命令。 在这种情况下,expr 命令只能看见:

    :.*
    shell 还会除去单个的引号。 不起作用的原因是因为冒号运算符要求有两个值。 此问题可以通过将 shell 变量以双引号括起来解决:
    LENGTH=`expr "$STR" : ".*"`
    现在,如果值为$STR变量为空,LENGTH将变量设置为值 0。 通常建议将 shell 变量括在双引号中。 不要将 shell 变量用单引号标记括起来。
  3. 要使用字符串的一部分,请输入:
    FLAG=`expr "$FLAG" : "-*\(.*\)"`
    这将从以下项中除去前导连字符 (如果有):$FLAGshell 变量。 冒号运算符给出了以下部分:FLAG由括在 \ (和 \) 字符之间的子表达式匹配的变量 (反斜杠,左括号和反斜杠,右括号)。 如果您忽略 \( 和 \) 子表达式字符的话,冒号运算符会给出匹配的字符数目。

    如果$FLAG变量设置为-(连字符) ,命令将显示语法错误消息。 发生这种情况的原因是, shell 替换了$FLAG变量,然后再运行 雷布尔 命令。 expr 命令不知道连字符是一个变量的值。 它只能理解:

    - : -*\(.*\)
    并且它会将第一个连字符解释成减号运算符。 要消除这种问题,请使用:
    FLAG=`expr "x$FLAG" : "x-*\(.*\)"`
  4. 要在 如果 语句中使用 雷布尔 命令,请输入:
    if expr "$ANSWER" : "[yY]" >/dev/null
    then
    echo ANSWER begins with "y" or "Y"
    fi
    如果$ANSWER变量开头为yYthen执行 如果 语句的一部分。 如果匹配成功表达式的结果为 1,并且 expr 命令会返回一个为 0 的出口值,此出口值被 if 语句识别成逻辑值 True。 如果匹配失败,结果为 0,出口值为 1。

    expr 命令的标准输出重新定向至 /dev/null 特殊文件,而废弃该表达式的结果。 如果您没有对它重新定向,结果就会写到标准输出,通常是您的工作站显示器。

  5. 请考虑以下表达式:
    expr "$STR" = "="
    如果$STR变量具有值=(等号) ,然后在 shell 处理此命令后, 雷布尔 命令会看到以下表达式:
    = = =
    expr 命令将此解释成在一行中的三个等号运算符,并显示一个语法出错消息。 一旦 shell 变量的值与 expr 运算符中的一个相同,这种情况就会发生。 避免这种问题的方法是,将该表达式写成:
    expr "x$STR" = "x="
  6. 要返回 $SHELL 环境变量的长度,请输入: /usr/bin/ksh,
    expr length $SHELL
    显示如下:
    12
  7. 要返回在 "abcdef" 中找到字符串 "de" 中的任何字符的第一个位置,请输入:
    expr index abcdef de
    显示如下:
    4
  8. 要返回在 "abcdef" 中找到字符串 "fd" 中的任何字符的第一个位置,请输入:
    expr index abcdef fd
    显示如下:
    4
  9. 要返回从位置 11 开始的字符串,对于字符串 "Goodnight Ladies" 的长度为 6 ,请输入:
    expr substr "Goodnight Ladies" 11 6
    显示如下:
    Ladies

文件

描述
/usr/bin/expr 包含了 expr 命令。