zoukankan      html  css  js  c++  java
  • 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]# 
    
  • 相关阅读:
    LeetCode "Palindrome Partition II"
    LeetCode "Longest Substring Without Repeating Characters"
    LeetCode "Wildcard Matching"
    LeetCode "Best Time to Buy and Sell Stock II"
    LeetCodeEPI "Best Time to Buy and Sell Stock"
    LeetCode "Substring with Concatenation of All Words"
    LeetCode "Word Break II"
    LeetCode "Word Break"
    Some thoughts..
    LeetCode "Longest Valid Parentheses"
  • 原文地址:https://www.cnblogs.com/minseo/p/13716792.html
Copyright © 2011-2022 走看看