Fork me on GitHub

shell算术运算与进制运算

(())与let是等效的 arithmetic expression

type 与[是等效的

source与.是等效的

 

其实,Shell(这里是Bash)本身不具备处理浮点计算的能力,但是可以使用“bc”这个高精度的计算器工具来帮助,另外,也可以在Bash中调用“awk”脚本来处理浮点运算。

linux shell 不同进制数据转换(二进制,八进制,十六进制,base64)

shell可以在不调用第3方命令,表示不同进制数据。这里总结以下表示方法。shell 脚本默认数值是由10 进制数处理,除非这个数字以某种特殊的标记法或前缀开头. 才可以表示其它进制类型数值。如:
以 0 开头就是 8 进制.以0x 开头就是16 进制数.使用 BASE#NUMBER 这种形式可以表示其它进制.BASE值:2-64. 

adj
octal    八进制的
decimal    十进制的
hexadecimal  十六进制的
((表达式)),(())里面可以是任意数据表达式。如果前面加入:”$”可以读取计算结果。 其它进制转为10进制 [root@
250-shiyan prog]# ((num=2#0111011));echo $num 59 [root@250-shiyan prog]# ((num=0123));echo $num 83 [root@250-shiyan prog]# ((num=0x1e));echo $num 30 [root@250-shiyan prog]# ((num=8#123));echo $num 83 0-9a-f [root@250-shiyan prog]# ((num=16#56c));echo $num 1388 0-9a-zA-Z [root@250-shiyan prog]# ((num=64#Z));echo $num 61 [root@250-shiyan prog]# ((num=64#_));echo $num 63 10进制转其它进制 这里使用到:bc外部命令完成。bc命令格式转换为:echo "obase=进制;值"|bc [root@250-shiyan prog]# echo "obase=2;8"|bc 1000 [root@250-shiyan prog]# echo "obase=8;9"|bc 11 shell内置各种进制表示方法非常简单。记得base#number 即可。这里记得赋值时候用(())符号。不能直接用=号了。=号没有值类型。默认将后面变成字符串了。如: 0开头已经失去了意义了。 可以通过定义符:let达到(()) 运算效果。 [root@250-shiyan prog]# num=0123;echo $num 0123 [root@250-shiyan prog]# let num=0123;echo $num 83

 

echo "$(echo 'scale=2;40*100/90' | bc)%"

[root@84-monitor newmonitor]# ssh 192.168.2.109 echo "`echo "scale=3;2*3/7"|bc`"

使用awk来处理浮点计算和浮点数比较
#!/bin/bash # author: Jay <smile665@gmail.com> # some examples for playing with floating point number. # basic usage of 'bc' tool in Bash. a=3.33 b=3.3 c=$(echo "$a + $b" | bc) d=$(echo "$a * $b" | bc) e=$(echo "scale=5; $a / $b" | bc) echo "c=a+b=$a+$b=$c" echo "d=a*b=$a*$b=$d" echo "e=a/b=$a/$b=$e" # "-l" parameter for 'bc' means using math library. pi=$(echo "scale=10; 4*a(1)" | bc -l) s=$(echo "s($pi/6)" | bc -l) echo "pi=$pi" echo "s=sin(pi/6)=$s" # use more options of 'bc' tool r=$(echo 'ibase=10;obase=2; 15+16' | bc) echo "binary of (15+16) is $r" # comparison for floating point numbers using 'bc' big=100 small=99.9 if [ $(echo "$big > $small" | bc) -eq 1 ]; then echo "$big is bigger than $small" fi # deal with floating point numbers with 'awk' language echo $(awk -v x=10 -v y=2.5 'BEGIN {printf "10/2.5=%.2f\n",x/y}') v=$(echo $big $small | awk '{ printf "%0.8f\n" ,$1/$2}') echo "$big / $small = $v" echo $big $small | awk '{if($1>$2) {printf"%f > %f\n",$1,$2} else {printf"%f <%f\n",$1,$2}}' master@jay-linux:~/workspace/mygit/shell/sh2012$ ./floating-point.sh c=a+b=3.33+3.3=6.63 d=a*b=3.33*3.3=10.98 e=a/b=3.33/3.3=1.00909 pi=3.1415926532 s=sin(pi/6)=.49999999994373819220 binary of (15+16) is 11111 100 is bigger than 99.9 10/2.5=4.00 100 / 99.9 = 1.00100100 100.000000 > 99.900000 master@jay-linux:~/workspace/mygit/shell/sh2012$ cat temp.bc 3+8 3/8 scale=2; 3/8 master@jay-linux:~/workspace/mygit/shell/sh2012$ bc -q temp.bc 11 0 .37

 

 

[root@250-shiyan sh]# bash let
2.22
[root@250-shiyan sh]# cat let
var=2
i=`echo "scale=2;$var*1.11"|bc`
echo $i

shell程序中的操作默认都是字符串操作
在bash中只提供了整数运算,一般shell通过let和expr这两个指令来实现。
使用格式为: let "x=$x+1" 或者x=`expr $x+1`,同时,在shell中,也可以通过((表达式))。使用格式为:((x=$x+1))
shell脚本只提供整数算术运算(三种方式)—((表达式))、let "表达式"、value=`expr 表达式右边`

整数运算
将需要运算的表达式写入在expr 后面,保证参数与运算符号中间有空格隔开。
这其中的let可以用(())代替,let "j=i*6+2″等价于((j=i*6+2)), 就像很多的循环中用法一样
注意:let必须是完整的算术表达式,即有等号两边
(())、expr 可以只有等号右边的计算,由$((...))、$(expr ...)、`expr ...` 查看返回结果
let表达式内变量不用加$
let中运算符与操作数不能有空格,expr中运算符与操作数必须有空格

(( expression ))与let EXPRESSION是等效的

浮点运算
var=1
var=`echo "scale=1;$var*2.0"|bc`  bc预设输出整数,用scale 指定小数点下位数
echo $var

output:
2.0

bc支持除位运算以外的所有运算。

另外一个支持浮点运算的方法是awk:
var=1
var=`echo "$var 1"|awk '{printf("%g",$1+$2)}'`
echo $var

output:
2

$ c=$(awk 'BEGIN{print 7.01*5-4.01 }')
$ echo $c

1:在shell 中$() 与 ``等效。执行中间包含的命令语句,返回执行结果。
2:从效率来说let==(()) > expr > bc。let和(())运行是内建命令,使用相同的算法。
3:let 和 expr 的运算是整数运算,不包括浮点预算。
4:expr和bc是外部程序,expr的体积几乎等于bc的1/3,执行一次装入内存所消耗的时间就不一样。
5:从运算能力来说,bc排第一位。


let命令具有返回值.当计算结果(若有多个表达式时,以最后一个为准)为0时,
返回值为1,否则为0.
当表达式中含有shell的特殊字符(如|)时,需要用引用符('或")将其引用起来.
使用let时还需要注意的时,对于let x+y这样的式子,shell虽然计算了x+y的值
但却将结果丢弃,若不想这样,可以使用let sum=x+y将x+y的结果保存在变量sum中
另外还可以使用((和))操作符取代let命令,而且这样的话,还可以省去对算术
表达式的引用,如果想返回表达式的值,则需用$(())的格式.

if的条件中,“=”用于比较字符串;“-eq”用于比较整型数。

Bash shell 的算术运算有四种方式:
1:使用 expr 外部程式

加法 r=`expr 4 + 5`
echo $r
注意! '4' '+' '5' 这三者之间要有空白
r=`expr 4 * 5` #错误
乘法 r=`expr 4 \* 5`

2:使用 $(( ))
r=$(( 4 + 5 ))
echo $r

3:使用 $[ ]

r=$[ 4 + 5 ]
echo $r

乘法
r=`expr 4 \* 5`
r=$(( 4 * 5 ))
r=$[ 4 * 5 ]
echo $r

除法
r=`expr 40 / 5`
r=$(( 40 / 5 ))
r=$[ 40 / 5 ]
echo $r

减法
r=`expr 40 - 5`
r=$(( 40 - 5 ))
r=$[ 40 - 5 ]
echo $r

求余数
r=$[ 100 % 43 ]
echo $r

乘幂 (如 2 的 3 次方)
r=$(( 2 ** 3 ))
r=$[ 2 ** 3 ]
echo $r
注:expr 沒有乘幂

4:使用let 命令
加法:
n=10
let n=n+1
echo $n #n=11

乘法:
let m=n*10
echo $m

除法:
let r=m/10
echo $r


求余数:
let r=m%7
echo $r


乘冪:
let r=m**2
echo $r

虽然Bash shell 有四种算术运算方法,但并不是每一种都是跨平台的,建议使用expr。
另外,我们在 script 中经常有加1操作,以下四法皆可:
m=$[ m + 1]
m=`expr $m + 1`
m=$(($m + 1))
let m=m+1

posted on 2014-12-30 11:13  阳光-源泉  阅读(4991)  评论(0编辑  收藏  举报

导航