• shell中进行算术运算的各种方法


      参考:http://www.zsythink.net/archives/1145

      shell中,无法直接进行算术运算,如果直接进行算术运算会出现如下情况。

    [root@node1 shell_learn]# a=1+2
    [root@node1 shell_learn]# echo $a
    1+2
    [root@node1 shell_learn]# c=5*6
    [root@node1 shell_learn]# echo $c
    5*6
    [root@node1 shell_learn]# 
    

       从上图可以看出,默认情况下,shell不会直接进行算术运算,而是把"算术符号"当做"字符串"与两个变量的值连接在了一起,形成了一个新的字符串,那么,在bash中,应该怎样进行算术运算呢?细分之下,常用方法有6种,如下。

      

      此处先对各种方法进行概述,后续会针对每种方法给出示例。

      (1) 使用let命令进行算术运算,只支持整数运算。

      (2) 使用expr命令进行算术运算,只支持整数运算。

      (3) 使用bc命令进行算术运算,支持小数运算。

      (4) 使用运算语法:$[算术表达式],只支持整数运算。

      (5) 使用运算语法:$((算术表达式)),只支持整数运算。

      (6) 在初始化变量时,将变量定义为"整数"类型,则可直接进行整数运算。

      方法一:借助let命令进行整数运算

      let命令是shell的内建命令,我们可以借助let命令进行整数运算,这种方法只支持整数运算,不支持包含小数的运算,示例如下。

    [root@node1 shell_learn]# let a=1+2
    [root@node1 shell_learn]# echo $a
    3
    [root@node1 shell_learn]# let a=1-2
    [root@node1 shell_learn]# echo $a
    -1
    [root@node1 shell_learn]# let a=5/2
    [root@node1 shell_learn]# echo $a
    2
    [root@node1 shell_learn]# let a=5%2
    [root@node1 shell_learn]# echo $a
    1
    [root@node1 shell_learn]# let a=3.3*3
    -bash: let: a=3.3*3: 语法错误: 无效的算术运算符 (错误符号是 ".3*3")
    [root@node1 shell_learn]# 
    

       从上图中可以看到,当借助let命令进行算术运算时,"运算过程"与"运算结果"中都不会包含小数,而且这种方法需要借助一个变量,将计算后的值赋值给这个变量后进行输出,但是let命令是shell内建命令,这是它的优势,只要当前服务器上存在shell,即可使用它进行整数运算。

      方法二:借助expr命令进行算术运算

      expr命令也支持算术运算功能,虽然它的功能不止于此,但是此处我们只使用它进行算术运算,expr命令与let命令相似,也只能进行整数运算,而且,使用expr命令进行算术运算时,需要注意以下两点

      1、数值与运算符号之间需要用空格隔开,否则无法进行算术运算。

      2、使用expr命令进行乘法运算时,需要将"乘号"转义,否则会报错。

    [root@node1 shell_learn]# expr 1 + 2
    3
    [root@node1 shell_learn]# expr 1+2
    1+2
    [root@node1 shell_learn]# expr 5 - 2
    3
    [root@node1 shell_learn]# expr 5 / 2
    2
    [root@node1 shell_learn]# expr 5 % 2
    1
    [root@node1 shell_learn]# expr 5 * 2
    expr: 语法错误
    [root@node1 shell_learn]# expr 5 * 2
    10
    [root@node1 shell_learn]# a=33
    [root@node1 shell_learn]# b=2
    [root@node1 shell_learn]# expr $a * $b / 3
    22
    [root@node1 shell_learn]# 
    

       当然,如果我们想要使用经过计算过的值,可以使用'命令引用'。

    [root@node1 shell_learn]# a=2
    [root@node1 shell_learn]# b=3
    [root@node1 shell_learn]# aandb=`expr $a + $b`
    [root@node1 shell_learn]# echo $aandb
    5
    [root@node1 shell_learn]# 
    

       方法三:借助bc命令进行算术运算

      bc命令大家可能已经很熟悉了,它是linux下最常用的"计算器",我们可以借助bc命令进行算术运算,使用这种方法的优势就是支持小数运算。

    注意:在使用"除法"时,需要指定小数点精度,否则运算结果中不会包含小数,使用scale指定小数点精度。

      示例如下:

    [root@node1 shell_learn]# echo "1.3+2.4"|bc
    3.7
    [root@node1 shell_learn]# echo "1.3+2.3333"|bc
    3.6333
    [root@node1 shell_learn]# echo "1.3+2.33333"|bc
    3.63333
    [root@node1 shell_learn]# echo "5+7"|bc
    12
    [root@node1 shell_learn]# echo "5*7.2"|bc
    36.0
    [root@node1 shell_learn]# echo "8.3-3"|bc
    5.3
    [root@node1 shell_learn]# echo "8/3"|bc
    2
    [root@node1 shell_learn]# echo "scale=3;8/3"|bc
    2.666
    [root@node1 shell_learn]# 
    

       上图中,如果使用bc命令进行除法运算,同时希望计算结果按照指定的精度显示,需要使用scale指定小数点精度,上图中scale=3表示显示小数点后面的三位精度。

      但是需要注意,当使用bc命令时,如果运算结果为不到1的小数,则不会显示小数点前面的"零",示例如下。

    [root@node1 shell_learn]# a=3
    [root@node1 shell_learn]# b=4
    [root@node1 shell_learn]# echo "scale=2;$a/$b"|bc
    .75
    [root@node1 shell_learn]# echo "0.2+0.3"|bc
    .5
    [root@node1 shell_learn]# 
    

       除了使用管道,将echo输出的内容重定向到bc,还可以使用如下方法利用bc,它们是等效的。

    [root@node1 shell_learn]# a=3
    [root@node1 shell_learn]# b=4
    [root@node1 shell_learn]# bc <<< "$a+$b"
    7
    [root@node1 shell_learn]# 
    

       方法四:使用运算语法 $[算术表达式]

      示例如下。

    [root@node1 shell_learn]# c=$[1+2]
    [root@node1 shell_learn]# echo $c
    3
    [root@node1 shell_learn]# a=3
    [root@node1 shell_learn]# b=4
    [root@node1 shell_learn]# echo $[$a*$b]
    12
    [root@node1 shell_learn]# d=$[$a-$b]
    [root@node1 shell_learn]# echo $d
    -1
    [root@node1 shell_learn]# 
    

       方法五:使用运算语法 $((算术表达式))

       这种方法与方法四类似,示例如下。

    [root@node1 shell_learn]# echo $((1+2))
    3
    [root@node1 shell_learn]# echo $(($a+$b))
    7
    

       方法六:将变量声明为整形

      这种方法也比较简单,可以直接将变量声明为"整数",然后即可直接进行整数运算,示例如下:

    [root@node1 shell_learn]# declare -i s
    [root@node1 shell_learn]# s=(1+9)/2
    [root@node1 shell_learn]# echo $s
    5
    [root@node1 shell_learn]# 
    
  • 相关阅读:
    七牛云的 python sdk 是如何 批量删除资源的
    mysql 主从复制
    django3上线部署踩的坑
    基于linux在线预览
    数据库2
    数据库3
    安装 webstorm--->vue
    Django基础1
    pymysql基础
    前段之jQuery
  • 原文地址:https://www.cnblogs.com/minseo/p/13716792.html
Copyright © 2020-2023  润新知