shell中数学运算

来源:互联网 发布:淘宝转让被骗案例店 编辑:程序博客网 时间:2024/06/02 03:57

shell中的赋值和操作默认都是字符串处理

shell中进行数学计算的方法
1) Linux shell 中使用 let , [ ] ,(( )) 三种运算符操作 shell 变量进行简单的基本运算;
2)Linux shell 中使用 expr 与 bc 两个程序实现高级运算;
 

错误举例
a)
var=1+1
echo $var
输出的结果是1+1,悲剧,呵呵

b)
var=1
var=$var+1
echo $var
输出结果是1+1,依然悲剧,呵呵

 
 
正确方法
1)使用let
let 命令可以用于直接执行基本操作:
当使用 let 的时候,我们不使用 $ 符号引用变量。
 
var=1
let "var+=1"
echo $var
输出结果为2,算术表达式中没有空格

let res=var+var
printf "let res =%d\n" $res

注意:
a)经我测试let几乎支持所有的运算符,在网上看到一篇文章说“let不支持++、--和逗号、(、)”,但经我测试自加、自减、以及括号的优先级都得到了很好的支持
b)方幂运算应使用“**”
c)参数在表达式中直接访问,不必加$
d)一般情况下算数表达式可以不加双引号,但是若表达式中有bash中的关键字则需加上
e)let后的表达式只能进行整数运算

2)使用(())
跟 " [ ] " 运算符一样:
同样支持使用 $ 符号引用变量进行基本运算,同时支持变量名与运算符之间不带空格。

var=1
((var+=1))
echo $var
输出结果为2

result1=$(( no1 + no2 ));
result2=$((no1+no2+3));
result3=$(( $no1+$no2 + 5))
注意:
(())的使用方法与let完全相同

3)使用$[]
跟 let 命令很相似:
"[ ]" 运算符里面可以使用 $ 符号引用变量,同时支持变量名与运算符之间不带空格。

var=1
var=$[$var+1]
echo $var
输出结果位2
result1=$[ no1 + no2 ];
result2=$[no1+no2 + 7];
result3=$[ $no1+$no2+5 ];
注意:
a)$[]将中括号内的表达式作为数学运算先计算结果再输出
b)对$[]中的变量进行访问时前面需要加$
c)$[]支持的运算符与let相同,但也只支持整数运算

4)使用expr
"expr" 命令同样支持 $ 符号引用变量进行基本运算,但是变量与运算符之间必须使用空格作为分隔符;
在使用 "expr" 命令对变量进行运算后,整个表达式必须使用 " · expression · " 的模式赋值给变量,即包含在 " ` " 符里面,
并且等效于 " $( expression ) " 模式。
result1=`expr 3 + 4`
result2=`expr $no1 + 4`
result3=`expr $no1 + $no2`
result4=`expr $no1+$no2`
result5=$(expr $no1 + 3)
result6=$(expr $no1+4)
result7=$(expr $no1+$no2)
var=1
var=`expr $var + 1`
echo $var
输出结果为2
注意:
a)expr后的表达式个符号间需用空格隔开
b)expr支持的操作符有: |、&、<、<=、=、!=、>=、>、+、-、*、/、%
c)expr支持的操作符中所在使用时需用\进行转义的有:|、&、<、<=、>=、>、*
e)expr同样只支持整数运算

5)使用bc(可以进行浮点数计算)
var=1
var=`echo "$var+1"|bc`
echo $var
输出结果为2
介绍:
bc是linux下的一个简单计算器,支持浮点数计算,在命令行下输入bc即进入计算器程序,而我们想在程序中直接进行浮点数计算时,利用一个简单的管道即可解决问题。
注意:
1)经我测试bc支持除位操作运算符之外的所有运算符。
2)bc中要使用scale进行精度设置
3)浮点数计算实例
var=3.14
var=`echo "scale=2;$var*3"|bc`
echo $var
输出结果为9.42

6)使用awk(可进行浮点数计算)
var=1
var=`echo "$var 1"|awk '{printf("%g",$1*$2)}'`
echo $var
输出结果为2
介绍:
awk是一种文本处理工具,同时也是一种程序设计语言,作为一种程序设计语言,awk支持多种运算,而我们可以利用awk来进行浮点数计算,和上面bc一样,通过一个简单的管道,我们便可在程序中直接调用awk进行浮点数计算。
 注意:
1)awk支持除微操作运算符之外的所有运算符
2)awk内置有log、sqr、cos、sin等等函数
3)浮点数计算实例
var=3.14
var=`echo "$var 2"|awk '{printf("%g",sin($1/$2))}'`
echo $var
输出结果为1

2, Linux shell 中使用 bc 命令实现高级数学运算:
 bc 命令使用 标准输入 stdin 作为输入;
 bc 是一个支持精确的浮点运算的高级计算器;
 bc 拥有相当多的输入选项,并且支持数学函数调用;
 执行 bc --help 自行查看 bc 所支持的输入选项;
 
2.1 bc 命令使用标准输入 stdin 作为输入,并且支持浮点运算:
 echo "----------------- bc command ----------------"
 echo "4 * 0.56" | bc;
 no=48;
 result1=`echo "$no * 1.5" | bc`;
 echo "result1 = $result1";

2.2 bc 命令支持运算精度设置:
 通过附加参数可以给 bc 指定运算精度;
 附加参数使用分号 " ; " 作为分隔符;
 result2=`echo "scale=9;$no / 3;" | bc`;
 echo "result2 = $result2";

2.3 使用 bc 进行数值的记数进制间转换:
 
 通过 ibase=value 作为附加参数,指定输入变量的记数进制;
 通过 obase=value 作为附加参数,指定输出变量的记数进制;
 no=100;
 echo "echo \"obase=2;ibase=10;$no\" | bc = `echo "obase=2;ibase=10;$no" | bc`";
 no=1000;
 echo "echo \"scale=5;obase=10;ibase=2;$no/3\" | bc = `echo "scale=5;obase=10;ibase=2;$no/3" | bc`";

2.4 使用 bc 调用数学公式进行高级数学运算:
 " sqrt(value) " 执行 value 的开方运算;
 " value^index " 执行 value 的幂运算;
 echo "sqrt(100) = `echo "sqrt(100)" | bc`";
 echo "sqrt(100) = $(echo "sqrt(100)" | bc)";
 echo "10^3 = `echo "10^3" | bc`";
 echo "10^3 = $(echo "10^3" | bc)";

 

0 0