[关闭]
@cdmonkey 2014-12-03T07:34:33.000000Z 字数 3940 阅读 1074

Shell中的算术运算

shell


以下方法都可以进行变量的数值(除了bc,其余的方法只能够进行整数运算)计算。

1、使用expr指令

expr指令一般用于整数值,但也可用于字符串,用来求表达式的值。同时,expr也是一个命令行计算器。

指令格式:expr Expression
  1. #需要注意:运算符两边都要有空格,也就是说两个运算值以及运算符之间要用空格隔开。
  2. [root@MySQL-E ~]# expr 2 + 50
  3. 52
  4. [root@MySQL-E ~]# expr 2 \* 50
  5. 100
  6. #对于乘法运算符需要转意,而除法及取余运算符则无需转意。
  7. #目前还不支持幂运算。
  1. #还可以使用expr在循环控制语句中进行增量计算。首先,循环初始化为0,然后循环值加1,并使用反引号。
  2. #但是,这样的用法执行效率不佳,应避免使用。
  3. [root@WEB-A1 test]# i=0
  4. [root@WEB-A1 test]# i=`expr $i + 1`
  5. [root@WEB-A1 test]# echo $i
  6. 1

还可以将中括号与expr相结合来使用:

expr $[Expression]
  1. #中括号内的表达式书写对于空格并不敏感,书写要求比较宽松。
  2. #其实如果将下面示例中的expr替换为echo,也是没有问题的,根本上讲,还是属于中括号本身的用法。
  3. [root@WEB-A1 test]# expr $[2+3]
  4. 5
  5. [root@WEB-A1 test]# expr $[2 ** 3]
  6. 8

特殊用法:
用法一:判断文件扩展名

expr STRING : REGEXP    anchored pattern match of REGEXP in STRING
  1. [root@WEB-A1 test]# cat file.sh
  2. #!/bin/sh
  3. #请注意判断表达式的写法,尽量遵循这种形式的写法。该方法适合判断文件扩展名。
  4. if expr "$1" : ".*\.html" &>/dev/null
  5. then
  6. echo "This is a HTML file!"
  7. else
  8. echo "This is not a HTML file!"
  9. fi
  10. [root@WEB-A1 test]# sh file.sh index.html
  11. This is a HTML file!
  12. [root@WEB-A1 test]# sh file.sh index.asp
  13. This is not a HTML file!

用法二:判断是否为整数

  1. [root@WEB-A1 ~]# expr 1 + 2
  2. 3
  3. [root@WEB-A1 ~]# expr 1 + 2.5
  4. expr: non-numeric argument
  5. [root@WEB-A1 ~]# expr 1 + a
  6. expr: non-numeric argument
  7. #如果运算参数不是整数,则会出现报错信息,换句话讲,就是返回码$?不为0。因此,我们可以利用这个原理来进行是否为整数的判断。
  8. [root@WEB-A1 test]# cat test_integer.sh
  9. #!/bin/sh
  10. expr $1 + 1 &>/dev/null
  11. if [ $? -eq 0 ]
  12. then
  13. echo "This arg is a integer!"
  14. else
  15. echo "Non-integer!"
  16. fi
  17. [root@WEB-A1 test]# sh test_integer.sh 5
  18. This arg is a integer!
  19. [root@WEB-A1 test]# sh test_integer.sh e
  20. Non-integer!

2、使用$((...))

这是比较常用的方法。只需要把算术表达式放入双小括号内即可。
常用运算符:
此处输入图片的描述

  1. #左右的两个括号之间不能有空格,而对于表达式的书写要求较为宽松,运算值及运算符两边有无空格均可。
  2. [root@MySQL-E ~]# echo $((5+2))
  3. 7
  4. [root@MySQL-E ~]# answer=$(( 10*5 ))
  5. [root@MySQL-E ~]# echo $answer
  6. 50

注意细节:如果是打印输出或是取值,则双小括号前面要加上美元符号($),如果仅仅是计算或作为条件进行判断,则不能使用$符号。另外,该方法对于书写的要求比较宽松。

  1. [root@WEB-A1 test]# ((a=5+10*2-4%3)) #单纯的进行计算。
  2. [root@WEB-A1 test]# echo $a
  3. 24
  4. [root@WEB-A1 test]# echo $((a+=1))
  5. 25
  6. #自增符号在后面(后缀式),则先引用后自增:前缀式是先加1再使用;后缀式是先使用再加1。
  7. #自减运算:前缀式是先减1再使用;后缀式是先使用再减1。
  8. #在自增或自减运算中,要分清表达式的值和变量的值。
  9. [root@WEB-A1 test]# echo $((a++))
  10. 25
  11. [root@WEB-A1 test]# echo $a
  12. 26
  1. [root@WEB-A1 test]# cat bijiao.sh
  2. #!/bin/sh
  3. a=10
  4. b=20
  5. if ((a<b)) #将比较结果作为判断的条件。
  6. then
  7. echo "a<b"
  8. fi
  9. [root@WEB-A1 test]# sh bijiao.sh
  10. a<b
  1. #还有下面的用法,即输出判断结果,1表示成立(真),0表示不成立(假):
  2. [root@WEB-A1 test]# echo $((3>2))
  3. 1
  4. [root@WEB-A1 test]# echo $((3<2))
  5. 0

3、使用$[...]

  1. #书写要求较为宽松,运算值及运算符两边有无空格均可。
  2. [root@MySQL-E ~]# echo $[4+6]
  3. 10
  4. [root@MySQL-E ~]# answer=$[ 10-4 ]
  5. [root@MySQL-E ~]# echo $answer
  6. 6

对于上面三种方法的小结:
注意,首先要求参加运算的数值必须为整数。

  1. #加法(减法同):
  2. [root@MySQL-E ~]# f1=`expr 4 + 5`
  3. [root@MySQL-E ~]# f2=$((4+5))
  4. [root@MySQL-E ~]# f3=$[4+5]
  5. [root@MySQL-E ~]# echo $f1 $f2 $f3
  6. 9 9 9
  1. #乘法(expr指令需要对运算符转意):
  2. [root@MySQL-E ~]# f1=`expr 4 \* 5`
  3. [root@MySQL-E ~]# f2=$((4*5))
  4. [root@MySQL-E ~]# f3=$[4*5]
  5. [root@MySQL-E ~]# echo $f1 $f2 $f3
  6. 20 20 20
  1. #除法(expr指令需要对运算符转意):
  2. [root@MySQL-E ~]# f1=`expr 20 \/ 4`
  3. [root@MySQL-E ~]# f2=$((20/4))
  4. [root@MySQL-E ~]# f3=$[20/4]
  5. [root@MySQL-E ~]# echo $f1 $f2 $f3
  6. 5 5 5
  1. #取模运算:
  2. [root@MySQL-E ~]# f1=`expr 20 \% 6`
  3. [root@MySQL-E ~]# f2=$((20%6))
  4. [root@MySQL-E ~]# f3=$[20%6]
  5. [root@MySQL-E ~]# echo $f1 $f2 $f3
  6. 2 2 2
  1. #幂运算:expr指令没有幂运算。
  2. [root@MySQL-E ~]# f2=$((10**3))
  3. [root@MySQL-E ~]# f3=$[10**3]
  4. [root@MySQL-E ~]# echo $f2 $f3
  5. 1000 1000

4、使用let指令

指令格式:let arg [arg ...]     每个参数都是一个求值的算术表达式。
  1. [root@MySQL-E ~]# n=10
  2. [root@MySQL-E ~]# let n=n+1
  3. [root@MySQL-E ~]# echo $n
  4. 11
  5. #使用let命令可以使后面所接的参数,或者说是表达式,进行算数运算。

5、使用bc

首先,bc是一个支持浮点数,功能完备的计算器。其次,其使用方式有两种,一种是直接进入bc的运行界面,进行运算操作;另一种是在命令行中通过echo及管道符向其输送操作指令进行运算。

  1. #第一种使用方法不在此介绍。我们来看第二种使用方法:
  2. [root@WEB-A1 ~]# echo "5+5"|bc
  3. 10
  4. [root@WEB-A1 ~]# echo "0.618+3.14"|bc
  5. 3.758

实例:计算从1加到10的结果

  1. #方法一,可以使用循环语句:
  2. [root@WEB-A1 test]# cat 1-10.sh
  3. #!/bin/sh
  4. SUM=0
  5. for ((i=1;i<=10;i++))
  6. do
  7. SUM=$(($SUM+$i))
  8. done
  9. echo $SUM
  10. [root@WEB-A1 test]# sh 1-10.sh
  11. 55
  12. #方法二,更为简洁的方法是使用seq以及bc命令相结合:
  13. [root@WEB-A1 test]# echo `seq -s + 10`|bc
  14. 55
  15. #或者也可以这样:
  16. [root@WEB-A1 test]# echo {1..10}|sed 's# #+#g'|bc
  17. 55
  18. #方法三,这是最简单的方法了:
  19. [root@WEB-A1 test]# echo $((`seq -s + 10`))
  20. 55
  21. #除此之外,还有许多的方法,但基本思路是一样的。

对于+1操作,可以使用下面的方法:

  1. [root@MySQL-E ~]# m=9
  2. [root@MySQL-E ~]# m=$[m + 1];echo $m
  3. 10
  4. [root@MySQL-E ~]# m=9
  5. [root@MySQL-E ~]# m=`expr $m + 1`;echo $m
  6. 10
  7. [root@MySQL-E ~]# m=9
  8. [root@MySQL-E ~]# m=$(($m + 1));echo $m
  9. 10
  10. [root@MySQL-E ~]# m=9
  11. [root@MySQL-E ~]# let m=m+1;echo $m
  12. 10
  13. #当然了,这样可不行呦~
  14. [root@MySQL-E ~]# m=9
  15. [root@MySQL-E ~]# m=$m+1
  16. [root@MySQL-E ~]# echo $m
  17. 9+1

程序实例:从1加到100

  1. #!/bin/sh
  2. i=1
  3. sum=0
  4. while [ $i -le 100 ]
  5. do
  6. sum=`expr $sum + $i`
  7. i=`expr $i + 1`
  8. done
  9. echo $sum
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注