zoukankan      html  css  js  c++  java
  • Shell脚本之六 数学计算

    前面一节Shell篇之五 基本运算符介绍了常见的 Shell 算术运算符,这节介绍 Shell 的数学计算。Shell 和其它编程语言不同,Shell 不能直接进行算数运算,必须使用数学计算命令。

    下面我们先来看一个反面的例子:

    #!bin/bash
    
    echo 2+8
    a=23
    b=$a+55
    echo $b
    
    b=90
    c=$a+$b
    echo $c
    

    运行脚本:

    $ ./tesh.sh
    2+8
    23+55
    

    从上面的运算结果可以看出,默认情况下,Shell 不会直接进行算术运算,而是把+两边的数据(数值或者变量)当做字符串,把+当做字符串连接符,最终的结果是把两个字符串拼接在一起形成一个新的字符串。

    这是因为,在 Bash Shell 中,如果不特别指明,每一个变量的值都是字符串,无论你给变量赋值时有没有使用引号,值都会以字符串的形式存储。

    换句话说,Bash shell 在默认情况下不会区分变量类型,即使你将整数和小数赋值给变量,它们也会被视为字符串,这一点和大部分的编程语言不同。


    一、数学计算命令

    要想让数学计算发挥作用,必须使用数学计算命令,Shell 中常用的数学计算命令如下表所示。

    运算操作符/运算命令 说明
    (( )) 用于整数运算,效率很高,推荐使用
    let 用于整数运算,和 (()) 类似。
    $[] 用于整数运算,不如 (()) 灵活。
    expr 可用于整数运算,也可以处理字符串。比较麻烦,需要注意各种细节,不推荐使用。
    bc Linux下的一个计算器程序,可以处理整数和小数。Shell 本身只支持整数运算,想计算小数就得使用 bc 这个外部的计算器。

    如果大家时间有限,只学习 (()) 和 bc 即可,不用学习其它的了:(()) 可以用于整数计算,bc 可以小数计算。


    二、Shell (())

    双小括号 (( )) 是 Shell 中专门用来进行整数运算的命令,它的效率很高,写法灵活,但只能进行整数运算,不能对小数(浮点数)或者字符串进行运算。


    Shell (( )) 的用法

    双小括号 (( )) 的语法格式为:

    ((表达式))
    

    表达式可以只有一个,也可以有多个,多个表达式之间以逗号,分隔。对于多个表达式的情况,以最后一个表达式的值作为整个 (( )) 命令的执行结果。可以使用$获取 (( )) 命令的结果,这和使用$获得变量值是类似的。

    运算操作符/运算命令 说明
    ((a=10+66) ((b=a-15)) 这种写法可以在计算完成后给变量赋值。以 ((b=a-15)) 为例,即将 a-15 的运算结果赋值给变量 c。
    a=$((10+66) b=$((a-15)) 可以在 (( )) 前面加上$符号获取 (( )) 命令的执行结果,也即获取整个表达式的值。
    ((a>7 && b==c)) (( )) 也可以进行逻辑运算,在 if 语句中常会使用逻辑运算。
    echo $((a+10)) 需要立即输出表达式的运算结果时,可以在 (( )) 前面加$符号。
    ((a=3+5, b=a+10)) 对多个表达式同时进行计算。

    在 (( )) 中使用变量无需加上$前缀,(( )) 会自动解析变量名,这使得代码更加简洁,也符合程序员的书写习惯。


    实例

    用 (( )) 进行稍微复杂一些的综合算术运算:

    #!/bin/bash
    
    ((a=1+2**3-4%3))
    echo $a
    
    b=$((1+2**3-4%3)) #运算后将结果赋值给变量,变量放在了括号的外面。
    echo $b
    
    echo $((1+2**3-4%3)) #也可以直接将表达式的结果输出,注意不要丢掉 $ 符号。
    
    a=$((100*(100+1)/2)) #利用公式计算1+2+3+...+100的和。
    echo $a
    
    echo $((100*(100+1)/2)) #也可以直接输出表达式的结果。
    

    运行脚本:

    $ ./test.sh
    8
    8
    8
    5050
    5050
    

    三、Shell let命令

    let 命令和双小括号 (( )) 的用法是类似的,它们都是用来对整数进行运算。注意:和双小括号 (( )) 一样,let 命令也只能进行整数运算,不能对小数(浮点数)或者字符串进行运算。


    Shell let 的用法

    Shell let 命令的语法格式为:

    let 表达式
    #或者
    let "表达式"
    #或者
    let '表达式'
    

    它们都等价于((表达式))。当表达式中含有 Shell 特殊字符(例如 |)时,需要用双引号" "或者单引号' '将表达式包围起来。

    和 (( )) 类似,let 命令也支持一次性计算多个表达式,并且以最后一个表达式的值作为整个 let 命令的执行结果。但是,对于多个表达式之间的分隔符,let 和 (( )) 是有区别的:

    • let 命令以空格来分隔多个表达式;
    • (( )) 以逗号,来分隔多个表达式。

    实例

    let 后面可以跟多个表达式:

    #!/bin/bash
    
    a=10 b=35
    let a+=6 c=a+b  #多个表达式以空格为分隔
    echo $a $c
    

    运行脚本:

    $ ./test.sh
    16 51
    

    四、Shell $[]

    []相当于 let 命令,也是用来对整数进行运算。


    Shell $[] 的用法

    Shell $[] 命令的语法格式为:

    $[表达式]
    

    在 [] 前面加上$符号获取 [] 命令的执行结果,也即获取整个表达式的值。


    实例

    实例如下:

    #!/bin/sh
    
    i=10
    
    i=$[i+10]
    echo $i
    
    i=$[i+100]
    echo $i
    

    运行脚本:

    $ ./test.sh
    20
    120
    

    五、Shell expr命令

    expr 是一款表达式计算工具,可用于整数运算,也可以处理字符串。比较麻烦,需要注意各种细节,不推荐使用。


    Shell expr 的用法

    Shell expr 命令的语法格式为:

    #或者 $(expr variable + variable)
    `expr variable + variable`
    

    表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。推荐用 $() 代替 ``。


    实例

    实例如下:

    #!/bin/sh
    
    i=10
    echo $i
    
    i=`expr $i + 10` #20
    echo $i
    
    i=`expr $i + 100` #120
    echo $i
    

    运行脚本:

    $ ./test.sh
    20
    120
    

    六、Linux bc命令

    bc 是 Linux 下的一个计算器程序,可以处理整数和小数。Shell 本身只支持整数运算,想计算小数就得使用 bc 这个外部的计算器。


    Linux bc 的用法

    Linux bc 命令的语法格式为:

    command "表达式" | bc
    

    实例

    实例如下:

    #!/bin/sh
    
    i=10
    echo $i
    j=3;
    echo $j
    
    m=`expr $i / $j`
    echo $m
    
    n=`echo "scale=9; $i / $j" | bc`
    echo $n
    

    运行脚本:

    $ ./test.sh
    3
    3.333333333
    
    

    注意:scale是指定精度,而且只有在除法的时候才有生效,其他都是安装原来都有几位就输出几位;bc支持除了位操作的所有运算。


    参考:

    Shell数学计算


  • 相关阅读:
    洛谷 P1226 【模板】快速幂||取余运算 题解
    洛谷 P2678 跳石头 题解
    洛谷 P2615 神奇的幻方 题解
    洛谷 P1083 借教室 题解
    洛谷 P1076 寻宝 题解
    洛谷 UVA10298 Power Strings 题解
    洛谷 P3375 【模板】KMP字符串匹配 题解
    Kafka Shell基本命令
    Mybatis与Hibernate的详细对比
    MyBatis简介
  • 原文地址:https://www.cnblogs.com/linuxAndMcu/p/11120837.html
Copyright © 2011-2022 走看看