第四章 shell 数字计算【整数、浮点数】

1. 整数计算

(1). expr

expr 可以有多个运算符组成的表达式,但运算符之间必须有空格隔开;特殊的运算符 需要加转义字符;比如称号 *  ----> \*

$expr 10 -2 \* 3 + 4 / 2     #运算符两侧必须有空格
expr: syntax error
$ expr 10 - 2 \* 3 + 4 / 2

$expr 10 - 2 * 3 + 4 / 2    #  * 必须用\ 来转义
expr: syntax error
$ expr 10 - 2 \* 3 + 4 / 2

注:expr 在脚本中是命令;如果给变量赋值,需要用`` 或者$()

$ a=`expr 10 - 2 \* 3 + 4 / 2`
$ echo $a
6

(2). $[]

$[]  可以有多个运算符组成的表达式;而且运算符两侧不是必须有空格【有、无空格均可】; * 也不能用\ 来转义;否则会报错

#!/bin/bash
arr=(10 20 30)

echo "${arr[0]},${arr[2]}"

bb=$[(10-2) * 3]        # 运算符两侧无须有空格;有无皆可
echo "bb=$bb"

var1=${arr[0]};
var2=${arr[1]};
var3=${arr[2]};
$ cat bc1.sh 
#!/bin/bash
var1=102.3
var2=350
res=`echo "scale=4;r=$var1 / $var2;if(length(r) == scale(r)) print 0;print r"|bc`

echo "res=$res"

var3=30

res=$(echo "scale=2;$var1*$var3/10-$var2"|bc)
echo "====res=$res"
res=`echo "scale=3;$var2 - $var1 * $var3"|bc`
echo "res===$res"

cc=$[($var1 - $var2) * $var3]echo "cc=$cc"dd=$[($var1 - $var2) \* $var3] #* 不能用 \ 来转义;否则会报错echo "dd=$dd"10,30bb=24cc=-300arr: line 16: (10 - 20) \* 30: syntax error: operand expected (error token is "\* 30")

2. 浮点数计算

(1). bc

bc 是基于bash的内置计算器;可以识别 整数、浮点数、字符等;

bc --->直接计算 然后推出  quit

bc的内置变量:scale=4  规定结果是小数点

$ cat bc1.sh 
#!/bin/bash
var1=102.3
var2=350
res=`echo "scale=4;r=$var1 / $var2;if(length(r) == scale(r)) print 0;print r"|bc`   #如果结果是0.1234  bc 默认小数点之前的0 不加;可以用过print 0 加上

echo "res=$res"

var3=30

res=$(echo "scale=2;$var1*$var3/10-$var2"|bc)
echo "====res=$res"

res=`echo "scale=3;$var2 - $var1 * $var3"|bc`   # bc 里面的变量可以用;隔开;而且表达式的语法跟我们的C 语言相同
echo "res===$res"
$ sh bc1.sh 
res=0.2922
====res=-43.10
res===-2719.0

(2). awk

awk 实现浮点数的预发也跟C 语言预发相同;都支持()

settle_percent=`echo "$TODAY_SUM $LASTWEEK_SUM"|awk '{change_percent = ($1 - $2)/$2;}END{print change_percent;}'`
   lastweek_sum_wan=`echo $LASTWEEK_SUM|awk '{res = $1 / 1000000000;}END{print res;}'`






   

你可能感兴趣的:(第四章 shell 数字计算【整数、浮点数】)