先看一些使用:

[root@centosTest shelltest]# expr 10 * 10
expr: syntax error
[root@centosTest shelltest]# expr 10 \* 10
100
[root@centosTest shelltest]# expr "10 * 10"
10 * 10
[root@centosTest shelltest]# expr "10 \* 10"
10 \* 10
[root@centosTest shelltest]# expr 10 \ 2
expr: syntax error
[root@centosTest shelltest]# expr 10 / 2
5
[root@centosTest shelltest]# expr 10 /* 2
expr: syntax error
[root@centosTest shelltest]# expr 10 \* 2
20
[root@centosTest shelltest]# let "add=1+1"
[root@centosTest shelltest]# echo $add
2
[root@centosTest shelltest]#

let要把表达式用引号引起来,expr则相反!

$(())

[root@centosTest shelltest]# i=$((i+1))
[root@centosTest shelltest]# echo  $i
1
[root@centosTest shelltest]# i=$((1+3))
[root@centosTest shelltest]# echo $i
4
[root@centosTest shelltest]# j=$((3*2))
[root@centosTest shelltest]# echo $j
6
[root@centosTest shelltest]#

expr+函数

[root@centosTest shelltest]# expr length "wo shi f"
8
[root@centosTest shelltest]# expr substring "wo shi fu wenchao" 11 18
expr: syntax error
[root@centosTest shelltest]# expr substr "wo shi fu wenchao" 11 18
wenchao
[root@centosTest shelltest]# expr index "woshiwoshi" o
2
[root@centosTest shelltest]#

增量计数:

loop=0
loop=`expr $loop + 1`
[root@centosTest shelltest]# loop=`expr $loop + 1`
[root@centosTest shelltest]# echo $loop
1
[root@centosTest shelltest]# loop=`expr $loop + 1`
[root@centosTest shelltest]# echo $loop
2
[root@centosTest shelltest]# loop=`expr $loop + 1`
[root@centosTest shelltest]# echo $loop
3
[root@centosTest shelltest]#
[root@centosTest shelltest]# num=1
[root@centosTest shelltest]# scale[1]=3
[root@centosTest shelltest]# num=`expr $num + ${scale[1]}`
[root@centosTest shelltest]# echo $num
4
[root@centosTest shelltest]#
[root@centosTest shelltest]# scale[1]=3
[root@centosTest shelltest]# num=`expr $num + ${scale[1]}`
[root@centosTest shelltest]# echo $num
4
[root@centosTest shelltest]# scale[2]=4
[root@centosTest shelltest]# scale[3]=5
[root@centosTest shelltest]# echo ${scale[*]}
3 4 5
[root@centosTest shelltest]#



输出导入/dev/null

[root@centosTest shelltest]# value=11
[root@centosTest shelltest]# expr $value + 1>/dev/null 2>&1
[root@centosTest shelltest]# echo $?
2
[root@centosTest shelltest]# value=11
[root@centosTest shelltest]# expr $value + 1 >/dev/null 2>&1
[root@centosTest shelltest]# echo $?
0



expr操作字符串

expr也操作用于字符串

字符串比较: expr 如果成功,返回值1,任何其他值为无效或错误。

如下面的例子测试两个字符串是否相等,这里字符串为“hello”和hello”。

[root@centosTest shelltest]# value=hello
[root@centosTest shelltest]# expr $value = "hello"
1
[root@centosTest shelltest]# echo $?
0

expr返回1。不要混淆了,这表明成功。现在检验其最后退出状态,返回0表示测试成功,
“hello”确实等于“hello”。


expr的模式匹配:

关于expr模式匹配,可以使用expr通过指定冒号:选项指定要进行字符串模式匹配。 .*代表任
何字符重复0次或多次。返回值为括号中的内容.

[root@centos-fuwenchao ~]# value=accounts
[root@centos-fuwenchao ~]# expr $value : '.*'
8
[root@centos-fuwenchao ~]# expr $value : '(.*).doc'
0
[root@centos-fuwenchao ~]# echo $value
accounts.doc
[root@centos-fuwenchao ~]# expr $value:'(.*).doc'
accounts.doc:(.*).doc
[root@centos-fuwenchao ~]# expr $value : '(.*).doc'
0
[root@centos-fuwenchao ~]#

如在tomcat的catalina.sh,使用了expr的模式匹配来获取连接文件的真实路径,例子如下:

# resolve links - $0 may be a softlink
PRG="$0"
while [ -h "$PRG" ]; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-< \(.*\)$'`   #这里expr的返回值为连接文件的真实路径
if expr "$link" : '/.*' < /dev/null; then #路径名返回1
PRG="$link"
else
PRG=`dirname "$PRG"`/"$link"
fi
done



expr数值测试

[root@centos-fuwenchao ~]#  rr=3.4
[root@centos-fuwenchao ~]#  expr $rr + 1
expr: non-numeric argument
[root@centos-fuwenchao ~]# rr=5
[root@centos-fuwenchao ~]#  expr $rr + 1
6
[root@centos-fuwenchao ~]#