shell中的expr注意事项

2013年8月9日 由 Creater 留言 »

对于一些具有特殊意义的操作符号,需要添加反斜线来反转义。比如两个字符串操作:

expr "test" \< "unix8"
expr "test" \& "unix8"

等于与不等于则可以不用转义

expr "test" = "unix8"
expr "test" != "unix8"

整数操作:

$expr 10 + 10

20

$expr 30 / 3

10

$expr 30 / 3 / 2

5 但是由于*号是shell中的通配符,所以需要转义。

$expr 30 \* 3

还可以测试一个数是否时整数:

r=1.1 expr $r + 1 expr: 非整数参数 

可以看出只能进行整数操作。 注意以上的操作符的前后都需要有空格,否则shell会当作字符来处理。比如:

r=1.1 expr $r+1 1.1+1 

上边的测试不好在程序中使用,可以使用下面的方法: 测试最后命令状态,如果为0,证明这是一个数,其他则表明为非数值。

 $value=12 $expr $value + 10 > /dev/null 2>&1
$echo $?
0

这是一个数。

$value=hello
$expr $value + 10 > /dev/null 2>&1
$echo $?
2

这是一个非数值字符。

expr模式匹配
expr支持正则表达式,如下因为正则表达式中的.代表任意一字符,*代表前面0个或者多个字符,所以.*.*意即任何字符重复0次或多次。:

value="www.unix8.net"
expr $value : '.*'
13

特别需要注意的时:冒号左右需要有空格。

提取字串
当中的5表示从第5个字符开始,6开始长度为6.

expr substr $value 5 6
unix8.

下面列出expr的具体用法

NAME
       expr - evaluate expressions

SYNOPSIS
       expr EXPRESSION
       expr OPTION

DESCRIPTION
       --help display this help and exit

       --version
              output version information and exit

       Print 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 REGEXP in STRING

       match STRING REGEXP
              same as STRING : REGEXP

       substr STRING POS LENGTH
              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
 Beware that many operators need to be escaped or quoted for shells.  Comparisons are arithmetic if both ARGs are numbers, else lex‐
       icographical.  Pattern matches return the string matched between \( and \) or null; if \( and \) are not used, they return the num‐
       ber of characters matched or 0.

广告位

发表评论

你必须 登陆 方可发表评论.