Bash数值计算

Bash shell 的算術運算有四種方式。

 

  1. 第一種:使用 expr 這個外部程式

    加法 r=`expr 4 + 5`

    echo $r

    注意! '4' '+' '5' 這三者之間要有空白

    注意! 以下是錯誤的寫法:

    r=`expr 4 * 5`

    原因:* 對 bash 而言有特殊意義(萬用字元),所以要改用以下寫法:

    乘法 r=`expr 4 \* 5`

    也就是說用 \ 取消 * 的特殊意義。

  2. 第二種:使用 $(( ))

    上述計算,可用以下方式來做:

    r=$(( 4 + 5 ))

    echo $r

  3. 第三種:使用 $[ ]

    上述計算,可用以下方式來做:

    r=$[ 4 + 5 ]

    echo $r

  4. 乘法

    r=`expr 4 \* 5`

    r=$(( 4 * 5 ))

    r=$[ 4 * 5 ]

    echo $r

  5. 除法

    r=`expr 40 / 5`

    r=$(( 40 / 5 ))

    r=$[ 40 / 5 ]

    echo $r

  6. 減法

    r=`expr 40 - 5`

    r=$(( 40 - 5 ))

    r=$[ 40 - 5 ]

    echo $r

  7. 求餘數

    r=$[ 100 % 43 ]

    echo $r

  8. 乘冪 (如 2 的 3 次方)

    r=$(( 2 ** 3 ))

    r=$[ 2 ** 3 ]

    echo $r

    註:expr 沒有乘冪

Bash 的第四種算術運算方法,它使用 let 這個命令,如下所示:

 

加法:

n=10
let n=n+1
echo $n

結果為 11


乘法:

let m=n*10
echo $m

結果為 110


除法:

let r=m/10
echo $r


求餘數:

let r=m%7
echo $r


乘冪:

let r=m**2
echo $r

 

雖然 Bash shell 有數種算術運算方法,但並不是每一種方法都可以跨平台,若您的 script 檔要在其它平台上使用,建議最好用 expr 這種方式,或許可攜性會好一點。

另外,我們在 script 中經常需要把某一變數做加一運算,以下四法皆可:

m=$[ m + 1]

m=`expr $m + 1`

m=$(($m + 1))

let m=m+1

用bc进行浮点数运算

基本格式

以上我们介绍的各种数值计算方案,不管是shell内部的还是外部的,都有一个问题,那就是不支持小数运算。这应该是shell本身的使用环境所决定的,实际在脚本中进行小数运算的情况可能并不多。

如果我们想进行浮点数的运算该怎么办呢?答案是利用外部工具(或者说命令)bc。bc是一个交互式的计算器。你可以在shell中键入bc来进入bc的命令提示符。但同样bc也支持写入到脚本中来进行数值计算。这需要用到管道,所谓管道就是将前一个命令的标准输出,作为标准输入传递给后面的命令。关于管道的更多概念,在以后讲IO操作的时候会提及。

 

[plain] view plain copy
 
  1. echo '45.36-22.33'|bc  

单引号双引号,这里无所谓。实现的过程就是将一个数学表达式传递给bc这个计算器。然后bc会将结果打印到标准输出。

 

设置精度

浮点运算,有一个很重要的概念就是精度。bc这里的精度指的的是小数的位数。在使用bc来进行除法运算的时候,你会发现默认是取整的,即没有小数部分。

比如:echo '2/3'|bc,它输出的是0。因为bc的默认精度是0。你可能会想到的解决方案是:echo '2.0/3'|bc。但是输出结果依旧是0。

其他运算,比如加、减和乘。都会自动取操作数中的最大精度为输出结果的精度。

[plain] view plain copy
 
  1. echo '2.0*3.00'|bc  
  2. echo '2.25+4.5'|bc  
  3. echo '5.66-7.888'|bc  

输出结果为:

 

 

[plain] view plain copy
 
  1. 6.00  
  2. 6.75  
  3. -2.228  

但是除法不行,你必须手动设置。

[plain] view plain copy
 
  1. echo 'scale=3;2/3'|bc  
  2. 666  

.666为输出的结果。因为设置了精度scale=3。前导0会被忽略。

 

bc功能强大,你甚至能直接利用bc来进行进制转换。

进制转换

obase为输出的进制,ibase为输入的进制。

 

http://mirror.sars.tw/Bash_Shell_by_ols3/c860.html

http://blog.csdn.net/guodongxiaren/article/details/40370701#comments

posted @ 2017-09-15 10:25  夏覓  Views(446)  Comments(0Edit  收藏  举报