expr 命令

来源:互联网 发布:sql 某字段相等的数量 编辑:程序博客网 时间:2024/05/03 01:21

 expr 命令 

用途

 

求表达式变量的值。

 

语法

expr Expression

 

描述

 

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

 

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

  • 用空格隔开每个项。
  • 用 / (反斜杠) 放在 shell 特定的字符前面。
  • 对包含空格和其他特殊字符的字符串要用引号括起来。

 

整数前面可以放一个一元连字符。在内部,整数被当作 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 5L Version 5.2 System Management Concepts: Operating System and Devices 中的 “Understanding Locale Environment Variables”。

 
注意: 下列字符串变量会超过标准,其行为可能在不同的操作系统中会有不同。这些字符串变量是“不”可移植的。

 

match String1 String2与 Expression1 : Expression2 相同。length String1返回 String1 的长度。index String1 String2返回 String1 中包含 String2 中任意字符的第一个位置。substr String1 StartPosition Length                         返回一个以 StartPosition 的字符开始的在 String1 中的字符串,并且是 Length 长度的字符串。

退出状态

 

此命令返回下列出口值:

 

0Expression 参数运算值既不为空也不为 0。1Expression 参数的计算值或者为空或者为 0。2Expression 参数是不合法的。>2发生错误。
注意:在 shell 处理完参数后,expr 命令除了利用数值外不能区分运算符和操作数。因此,如果 $a 的值是 j 的话,命令:

 

expr $a = j

 

就像:

 

expr j = j

 

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

 

expr X$a = Xj

 

示例

  1. 要修改一个 shell 变量,请输入:
    COUNT=`expr $COUNT + 1`

    这会加 1 到 shell 变量 $COUNT 上。 expr 命令以 grave accent 包装,这会导致 shell 将 expr 命令的标准输出替换到 COUNT= 命令的标准输出。$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" : "-*/(.*/)"`

    只要 $FLAG shell 变量前面有连字符,就会除去连字符。冒号运算符给出 FLAG 变量的一部分,该变量由在 /( 和 /) 字符(反斜杠,开括号和反斜杠,闭括号)中间的子表达式匹配。如果您忽略 /( 和 /) 子表达式字符的话,冒号运算符会给出匹配的字符数目。

    如果 $FLAG 变量设置成 - (连字符), 则该命令会显示一个语法错误消息。这是因为 shell 会将 $FLAG 变量的值替换,在运行 expr 命令之前。expr 命令不知道连字符是一个变量的值。它只能理解:

    - : -*/(.*/)

    并且它会将第一个连字符解释成减号运算符。要消除这种问题,请使用:

    FLAG=`expr "x$FLAG" : "x-*/(.*/)"`
  4. 要想使用 expr 命令在 if 语句中,请输入:
    if expr "$ANSWER" : "[yY]" >/dev/null
    则返回 ANSWER 以 "y" 或者 "Y" 开始 fi

    如果 $ANSWER 变量以 y 或者 Y 开始的话,if 语句的then 部分会执行。如果匹配成功表达式的结果为 1,并且 expr 命令会返回一个为 0 的出口值,这个出口值被 if 语句识别成逻辑值真。如果匹配失败,结果为 0,出口值为 1。

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

  5. 考虑下列表达式:
    expr "$STR" = "="

    如果 $STR 变量有值为 =(等号),那么在 shell 处理完这个命令之后,expr命令会看到表达式:

    = = =

    expr 命令将这个解释成在一行中的三个等号运算符,并显示一个语法出错消息。一旦 shell 变量的值与 expr 运算符中的一个相同,这种情况就会发生。避免这种问题的方法是,将该表达式写成:

    expr "x$STR" = "x="
  6. 要想返回 $SHELL 环境变量 /usr/bin/ksh 的长度,请输入:
    expr length $SHELL

    显示如下:

    12
  7. 要想返回 "de" 字符串中的任何一个字符在 "abcdef" 中出现的第一个位置,请输入:
    expr index abcdef de

    显示如下:T

    4
  8. 要想返回 "fd" 字符串的任何字符在 "abcdef" 中出现的第一个位置,请输入:
    expr index abcdef fd

    显示如下:

    4
  9. 要想返回 "Goodnight Ladies" 字符串中从位置11开始的6个字符长的字符串,请输入:
    expr substr "Goodnight Ladies" 11 6

    显示如下:

    Ladies

=============================================================

expr命令是一个手工命令行计数器,用于在UNIX/LINUX下求表达式变量的值,一般用于整数值,也可用于字符串。
–格式为:
expr Expression(命令读入Expression 参数,计算它的值,然后将结果写入到标准输出)
–参数应用规则:
用空格隔开每个项;
用 / (反斜杠) 放在 shell 特定的字符前面;
对包含空格和其他特殊字符的字符串要用引号括起来

–expr用法实例讲解:
(1)、计算字串长度
 > expr length “this is a test”
 14
(2)、抓取字串
 > expr substr “this is a test” 3 5
 is is
(3)、抓取第一个字符数字串出现的位置
 > expr index “sarasara”  a
 2
(4)、字串真实重现
 > expr quote sara
 sara
(5)、整数运算
 > expr 14 % 9
 5
 > expr 10 + 10
 20
 > expr 1000 + 900
 1900
 > expr 30 / 3 / 2
 5
 > expr 30 /* 3 (使用乘号时,必须用反斜线屏蔽其特定含义。因为shell可能会误解显示星号的意义)
 90
 > expr 30 * 3
 expr: Syntax error
(6)、增量计数
说明:expr在循环中用于增量计算。先将变量初始化为0,然后循环值加1,反引号的用法为命令替代。
> LOOP=0
> LOOP=`expr $LOOP + 1`
(7)、数值测试
说明:用expr测试一个数。如果试图计算非整数,则会返回错误。
> rr=3.4
> expr $rr + 1
expr: non-numeric argument
> rr=5
> expr $rr + 1
6
(8)、模式匹配
说明:expr也有模式匹配功能。可以使用expr通过指定冒号选项计算字符串中字符数。.*意即任何字符重复0次或多次。
> VALUE=account.doc
> expr $VALUE : ‘.*’
8
在expr中可以使用字符串匹配操作,这里使用模式抽取.doc文件附属名。
$expr $VALUE : ‘/(.*/).doc’
accounts