@cdmonkey
2014-12-03T07:34:33.000000Z
字数 3940
阅读 1334
shell
以下方法都可以进行变量的数值(除了bc,其余的方法只能够进行整数运算)计算。
expr指令一般用于整数值,但也可用于字符串,用来求表达式的值。同时,expr也是一个命令行计算器。
指令格式:expr Expression
#需要注意:运算符两边都要有空格,也就是说两个运算值以及运算符之间要用空格隔开。[root@MySQL-E ~]# expr 2 + 5052[root@MySQL-E ~]# expr 2 \* 50100#对于乘法运算符需要转意,而除法及取余运算符则无需转意。#目前还不支持幂运算。
#还可以使用expr在循环控制语句中进行增量计算。首先,循环初始化为0,然后循环值加1,并使用反引号。#但是,这样的用法执行效率不佳,应避免使用。[root@WEB-A1 test]# i=0[root@WEB-A1 test]# i=`expr $i + 1`[root@WEB-A1 test]# echo $i1
还可以将中括号与expr相结合来使用:
expr $[Expression]
#中括号内的表达式书写对于空格并不敏感,书写要求比较宽松。#其实如果将下面示例中的expr替换为echo,也是没有问题的,根本上讲,还是属于中括号本身的用法。[root@WEB-A1 test]# expr $[2+3]5[root@WEB-A1 test]# expr $[2 ** 3]8
特殊用法:
用法一:判断文件扩展名
expr STRING : REGEXP anchored pattern match of REGEXP in STRING
[root@WEB-A1 test]# cat file.sh#!/bin/sh#请注意判断表达式的写法,尽量遵循这种形式的写法。该方法适合判断文件扩展名。if expr "$1" : ".*\.html" &>/dev/nullthenecho "This is a HTML file!"elseecho "This is not a HTML file!"fi[root@WEB-A1 test]# sh file.sh index.htmlThis is a HTML file![root@WEB-A1 test]# sh file.sh index.aspThis is not a HTML file!
用法二:判断是否为整数
[root@WEB-A1 ~]# expr 1 + 23[root@WEB-A1 ~]# expr 1 + 2.5expr: non-numeric argument[root@WEB-A1 ~]# expr 1 + aexpr: non-numeric argument#如果运算参数不是整数,则会出现报错信息,换句话讲,就是返回码$?不为0。因此,我们可以利用这个原理来进行是否为整数的判断。[root@WEB-A1 test]# cat test_integer.sh#!/bin/shexpr $1 + 1 &>/dev/nullif [ $? -eq 0 ]thenecho "This arg is a integer!"elseecho "Non-integer!"fi[root@WEB-A1 test]# sh test_integer.sh 5This arg is a integer![root@WEB-A1 test]# sh test_integer.sh eNon-integer!
这是比较常用的方法。只需要把算术表达式放入双小括号内即可。
常用运算符:

#左右的两个括号之间不能有空格,而对于表达式的书写要求较为宽松,运算值及运算符两边有无空格均可。[root@MySQL-E ~]# echo $((5+2))7[root@MySQL-E ~]# answer=$(( 10*5 ))[root@MySQL-E ~]# echo $answer50
注意细节:如果是打印输出或是取值,则双小括号前面要加上美元符号($),如果仅仅是计算或作为条件进行判断,则不能使用$符号。另外,该方法对于书写的要求比较宽松。
[root@WEB-A1 test]# ((a=5+10*2-4%3)) #单纯的进行计算。[root@WEB-A1 test]# echo $a24[root@WEB-A1 test]# echo $((a+=1))25#自增符号在后面(后缀式),则先引用后自增:前缀式是先加1再使用;后缀式是先使用再加1。#自减运算:前缀式是先减1再使用;后缀式是先使用再减1。#在自增或自减运算中,要分清表达式的值和变量的值。[root@WEB-A1 test]# echo $((a++))25[root@WEB-A1 test]# echo $a26
[root@WEB-A1 test]# cat bijiao.sh#!/bin/sha=10b=20if ((a<b)) #将比较结果作为判断的条件。thenecho "a<b"fi[root@WEB-A1 test]# sh bijiao.sha<b
#还有下面的用法,即输出判断结果,1表示成立(真),0表示不成立(假):[root@WEB-A1 test]# echo $((3>2))1[root@WEB-A1 test]# echo $((3<2))0
#书写要求较为宽松,运算值及运算符两边有无空格均可。[root@MySQL-E ~]# echo $[4+6]10[root@MySQL-E ~]# answer=$[ 10-4 ][root@MySQL-E ~]# echo $answer6
对于上面三种方法的小结:
注意,首先要求参加运算的数值必须为整数。
#加法(减法同):[root@MySQL-E ~]# f1=`expr 4 + 5`[root@MySQL-E ~]# f2=$((4+5))[root@MySQL-E ~]# f3=$[4+5][root@MySQL-E ~]# echo $f1 $f2 $f39 9 9
#乘法(expr指令需要对运算符转意):[root@MySQL-E ~]# f1=`expr 4 \* 5`[root@MySQL-E ~]# f2=$((4*5))[root@MySQL-E ~]# f3=$[4*5][root@MySQL-E ~]# echo $f1 $f2 $f320 20 20
#除法(expr指令需要对运算符转意):[root@MySQL-E ~]# f1=`expr 20 \/ 4`[root@MySQL-E ~]# f2=$((20/4))[root@MySQL-E ~]# f3=$[20/4][root@MySQL-E ~]# echo $f1 $f2 $f35 5 5
#取模运算:[root@MySQL-E ~]# f1=`expr 20 \% 6`[root@MySQL-E ~]# f2=$((20%6))[root@MySQL-E ~]# f3=$[20%6][root@MySQL-E ~]# echo $f1 $f2 $f32 2 2
#幂运算:expr指令没有幂运算。[root@MySQL-E ~]# f2=$((10**3))[root@MySQL-E ~]# f3=$[10**3][root@MySQL-E ~]# echo $f2 $f31000 1000
指令格式:let arg [arg ...] 每个参数都是一个求值的算术表达式。
[root@MySQL-E ~]# n=10[root@MySQL-E ~]# let n=n+1[root@MySQL-E ~]# echo $n11#使用let命令可以使后面所接的参数,或者说是表达式,进行算数运算。
首先,bc是一个支持浮点数,功能完备的计算器。其次,其使用方式有两种,一种是直接进入bc的运行界面,进行运算操作;另一种是在命令行中通过echo及管道符向其输送操作指令进行运算。
#第一种使用方法不在此介绍。我们来看第二种使用方法:[root@WEB-A1 ~]# echo "5+5"|bc10[root@WEB-A1 ~]# echo "0.618+3.14"|bc3.758
实例:计算从1加到10的结果
#方法一,可以使用循环语句:[root@WEB-A1 test]# cat 1-10.sh#!/bin/shSUM=0for ((i=1;i<=10;i++))doSUM=$(($SUM+$i))doneecho $SUM[root@WEB-A1 test]# sh 1-10.sh55#方法二,更为简洁的方法是使用seq以及bc命令相结合:[root@WEB-A1 test]# echo `seq -s + 10`|bc55#或者也可以这样:[root@WEB-A1 test]# echo {1..10}|sed 's# #+#g'|bc55#方法三,这是最简单的方法了:[root@WEB-A1 test]# echo $((`seq -s + 10`))55#除此之外,还有许多的方法,但基本思路是一样的。
对于+1操作,可以使用下面的方法:
[root@MySQL-E ~]# m=9[root@MySQL-E ~]# m=$[m + 1];echo $m10[root@MySQL-E ~]# m=9[root@MySQL-E ~]# m=`expr $m + 1`;echo $m10[root@MySQL-E ~]# m=9[root@MySQL-E ~]# m=$(($m + 1));echo $m10[root@MySQL-E ~]# m=9[root@MySQL-E ~]# let m=m+1;echo $m10#当然了,这样可不行呦~[root@MySQL-E ~]# m=9[root@MySQL-E ~]# m=$m+1[root@MySQL-E ~]# echo $m9+1
程序实例:从1加到100
#!/bin/shi=1sum=0while [ $i -le 100 ]dosum=`expr $sum + $i`i=`expr $i + 1`doneecho $sum