shell数学运算
分类 | 描述 | 语法格式 | 示例 |
---|---|---|---|
简单运算 | 使用内置命令let | let 算术式 | let res=1+2 |
使用内置命令declare | declare -i 变量=算术式 | declare -i res=1+2*3 | |
使用[] | [算术式] | res=$[1+2] | |
算术扩展 | ((算术式)) | res=((1+2*3)) | |
高级运算 | 使用外部程序expr | expr 算术式 | res=`expr 1+2*3` |
使用bc | echo “”\|bc | echo “1+2”\|bc |
let
let命令是bash内置命令,可以实现简单的算术以及逻辑运算
#!/bin/bash
init=10
echo "init-->"$init
let add=init+50
echo "init add 50-->"$add
let add=$init+50
echo "init add 50-->"$add
let "quota=init+50"
echo "use quotation marks,init add 50-->"$quota
let res=\(init+50\)*\(2+2\)
echo "bracket-->"$res
[root@mesoscloud_test255148 yueling]# bash lettest.sh
init-->10
init add 50-->60
use quotation marks,init add 50-->60
bracket-->240
[root@mesoscloud_test255148 yueling]#
使用括号可能需要转义
[root@mesoscloud_test255148 yueling]# let sum=(1+2)*2 ;echo $sum
6
[root@mesoscloud_test255148 yueling]# let sum=(1+2)*(1+1) ;echo $sum
-bash: syntax error near unexpected token `( ’
[root@mesoscloud_test255148 yueling]# let sum=(1+2)*\(1+1\) ;echo $sum
6
[root@mesoscloud_test255148 yueling]# let “sum=(1+2)*(1+1)” ;echo $sum
6
对比这条执行的语句
declare
declare -i 变量=算术式
[root@mesoscloud_test255148 yueling]# declare -i sum=(1+2)*2+3
[root@mesoscloud_test255148 yueling]# echo $sum
9
[]
[]相当于let命令
#!/bin/bash
init=10
echo "init-->"$init
add=$[init+50]
echo "init add 50-->"$add
[root@mesoscloud_test255148 yueling]# bash squareBracketstest.sh
init-->10
init add 50-->60
[root@mesoscloud_test255148 yueling]#
(())
(())等价于[]
#!/bin/bash
init=10
echo "init-->"$init
add=$((init+50))
echo "init add 50-->"$add
addcp=$(($init+50))
echo "init add 50-->"$addcp
[root@mesoscloud_test255148 yueling]# bash brackettest.sh
init-->10
init add 50-->60
init add 50-->60
[root@mesoscloud_test255148 yueling]#
let命令中可以嵌套(())和[],(())和[]可以互相嵌套
#!/bin/bash
init=10
let res=$[init+51]
echo $res
let res=$[$init+52]
echo $res
let res=$(($init+53))
echo $res
let res=$((init+54))
echo $res
res=$[$((init)) + 55]
echo $res
res=$(($[init+56]))
echo $res
let res=$[$((init)) + 57]
echo $res
let res=$(($[init+58]))
echo $res
[root@mesoscloud_test255148 yueling]# bash mix.sh
61
62
63
64
65
66
67
68
[root@mesoscloud_test255148 yueling]#
expr
expr同样可以用来进行基本的算术运算。
#!/bin/bash
init=10
echo $init
add=`expr $init + 50`
echo $add
注意:
1、变量与运算符之间必须使用空格作为分隔符,若不使用空格则当普通字符串处理
2、在使用expr时,要特别”表达式”中是否包含shell的特殊字符,如*、|、<、>、!、&、(、),要使用”\”来转义。
bc
bc命令是一个支持精确的浮点运算的高级计算器,支持数学函数调用。
#!/bin/bash
num1=1
echo "\$num1="$num1
num2=3;
echo "\$num2="$num2
resInteger=`expr $num1 / $num2`
echo "expr : $num1/$num2="$resInteger
resScale=`echo "scale=9; $num1 / $num2" | bc`
echo "bc scale=9: $num1/$num2="$resScale
[root@mesoscloud_test255148 yueling]# bash bctest.sh
$num1=1
$num2=3
expr : 1/3=0
bc scale=9: 1/3=.333333333
[root@mesoscloud_test255148 yueling]#
bc还有很多高级用法,不在此一一展示,只是说明它可以执行数学计算~~~ 可自行 man bc进行研究
bc计算中若使用括号:
在双引号之间的括号不用转义,但是如果不使用引号引起来就需要转义
[root@mesoscloud_test255148 yueling]# sum=echo "(1+2)*2"|bc
;echo $sum
6
[root@mesoscloud_test255148 yueling]# sum=echo \(1+2\)*2|bc
;echo $sum
6