expr使用详解

概述

expr是执行表达式的意思,表达式可以是逻辑判断式,也可以是数学运算,更有用的是,也可以是正则表达。具体的表达式类型以及规则,可以参照说明文档。

这里要说的是,表达式的运算符和操作数之间必须有空格,并且,表达式的运算符很多时候都需要转义,如下:

expr 1 \> 2  #return 0
expr 1 \| 2 #return 1
expr 2 \| 1 #return 2
expr 2 \& 1 #return 2
expr 2 \& 0 #return 0

因为> 在shell中是重定向符号,所以需要转义。| 是管道,也需要转义。 & 也是命令行结束符表示后台运行,所以也需要转义。并且,符号的前后多需要有空格。

正则表达用法

expr还可以使用正则表达式从字符串中提取子串,使用正则表达式,有以下两种方式,这两种方式是等价的:

1 expr "STRING" : "REGEXP"
2 expr match "STRING" "REGEXP"

在使用正则表达式是,如果正则表达式中有\( 和\),那么括号中匹配到的内容会被返回,或者null(没匹配到)。如果没有括号,则返回的不是匹配内容,而是匹配的个数或者0(没匹配)。

一下是一个例子:

 1 # Resolve links: $0 may be a link
 2 PRG="$0"
 3 # Need this for relative symlinks.
 4 while [ -h "$PRG" ] ; do
 5     ls=`ls -ld "$PRG"`
 6     link=`expr "$ls" : '.*-> \(.*\)$'`
 7     if expr "$link" : '/.*' > /dev/null; then
 8         PRG="$link"
 9     else
10         PRG=`dirname "$PRG"`"/$link"
11     fi
12 done

在第5行中,用了括号,提取到了软链接的目标,也就是->后面的内容。在第7行中,则不是提取字符串,而是为了返回匹配的字符数量,如果返回数量不为0,说明匹配到了。

因为expr默认会把返回的结果打印出来,所以在第7行中,要结果输出重定向到 /dev/null。

其他用法

提取子串:

expr substr STRING POS LENGTH #POS从1开始,从指定位置提取指定长度的子串

搜索字符

expr index STRING CHAR #返回字符的位置,如果没找到字符,则返回0。

求字符串长度

expr length STRING 

 

参考: https://www.ibm.com/support/knowledgecenter/zh/ssw_aix_72/com.ibm.aix.cmds2/expr.htm

posted on 2019-05-03 20:56  J.M.Liu  阅读(91)  评论(0)    收藏  举报