zoukankan      html  css  js  c++  java
  • [ Shell入门教程 ] Shell编程中数值计算方法实例

        SHELL编程中经常会涉及到数值计算,有时候对于这些计算命令使用场景容易忘记或者混淆,这里针对常用的命令做个总结。主要包括let、bc、expr、(())等。

    1、let

        使用格式:let 表达式,表达式必须是完整的表达式,即等号两边。只能赋值,不支持浮点数运算,不支持直接输出

    $ var=10
    $ let var+=2 #var=12,中间不能有空格
    $ let var=var+2 #var=14
    $ let var*=2 #var=28
    $ let var/=2 # var=14

     无法计算浮点数,报错

    $ var=2.5
    $ let var+=1
    -bash: let: 2.5: 语法错误: 无效的算术运算符 (错误符号是 ".5")

    2、bc

      常用,支持浮点数运算

    echo "1+1" | bc # 2
    echo "1.5+1.5" | bc # 3.0
    echo "3-1.2" | bc #1.8
    echo "1.5*1.5" | bc #2.2
    echo "10/3" | bc # 3
    echo "scale=2;10/3" | bc #3.33

    看到乘数和除数的精度不同了吗?设置其他参数测试下

    echo "1.5*1.33333" | bc #1.99999
    echo "1.5111111111111111111111*1.33333" | bc #2.0148097777777777777777
    echo "4/5" | bc #0
    echo "1/2" | bc #0
    echo "6/5" | bc # 1

     乘法输出结果的精度和相乘数最长的进度保持一致。整数相除结果下取整。当然,它是可以赋值的

    var=$(echo "1+1"|bc) #var=2

    3、expr

      不支持浮点数运算,注意数字与计算符中的空格

    expr 1 + 1 #2
    expr 1 - 1 #0
    expr 1 * 1 #1,注意*号前面有\,否则报错
    expr 1 / 1 #1
    expr 1+1 #1+1,与预期不符
    expr 1.0 + 1 #输出语法错误
    var=$(expr 1 + 1) #var=2
    var2=$(expr ${var} + 2) #var2=4

    4、$(())

      不支持浮点数运算,不支持窗口直接执行$(()),

    var=$((1+1)) #1+1运算符前后中间是否有空格不影响计算
    v1=10
    v2=15
    var=$((v1+v2))
    var=$(($v1+$v2))
    a=$(( 1 + 1.0 )) #提示语法错误

      可以发现,在$(())中的变量带不带$取值符号都不影响计算。

    5、awk

      awk结合print的使用可以很好的各种完成数值计算,包括浮点数及精度控制。

    $ awk 'BEGIN{printf 1.0/2.0}' #0.5
    $ awk 'BEGIN{printf "5.2f%",10/3}' #3.33
    $ var1=10
    $ var2=3
    $ awk -v v1=${var1} -v v2=${var2} 'BEGIN{printf "%5.2f
    ",v1/v2}' #3.33

     最后来看个实例,输出1~5的数值

    #!/bin/bash
    
    i=1
    MAX=5
    while [ ${i} -lt ${MAX} ];do
      printf "${i}
    "
      i=$(($i+1))
    done

    输出结果

    1
    2
    3
    4

     

  • 相关阅读:
    Android Studio代码自己主动检測错误提示
    uva 1567
    UWP 新手教程2——怎样实现自适应用户界面
    远程服务的使用场景
    本地服务和远程服务
    本地应用调用远程服务中的方法
    混合方式开启服务
    绑定服务抽取接口
    绑定服务调用服务里的方法
    bind绑定服务的生命周期
  • 原文地址:https://www.cnblogs.com/linyfeng/p/7348713.html
Copyright © 2011-2022 走看看