(())与let是等效的 arithmetic expression
type 与[是等效的
source与.是等效的
其实,Shell(这里是Bash)本身不具备处理浮点计算的能力,但是可以使用“bc”这个高精度的计算器工具来帮助,另外,也可以在Bash中调用“awk”脚本来处理浮点运算。
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 $num59[root@250-shiyan prog]# ((num=0123));echo $num83[root@250-shiyan prog]# ((num=0x1e));echo $num30[root@250-shiyan prog]# ((num=8#123));echo $num830-9a-f[root@250-shiyan prog]# ((num=16#56c));echo $num13880-9a-zA-Z[root@250-shiyan prog]# ((num=64#Z));echo $num61[root@250-shiyan prog]# ((num=64#_));echo $num6310进制转其它进制这里使用到:bc外部命令完成。bc命令格式转换为:echo "obase=进制;值"|bc[root@250-shiyan prog]# echo "obase=2;8"|bc1000[root@250-shiyan prog]# echo "obase=8;9"|bc11shell内置各种进制表示方法非常简单。记得base#number 即可。这里记得赋值时候用(())符号。不能直接用=号了。=号没有值类型。默认将后面变成字符串了。如:0开头已经失去了意义了。可以通过定义符:let达到(()) 运算效果。[root@250-shiyan prog]# num=0123;echo $num0123[root@250-shiyan prog]# let num=0123;echo $num83
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# some examples for playing with floating point number. # basic usage of 'bc' tool in Bash.a=3.33b=3.3c=$(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' toolr=$(echo 'ibase=10;obase=2; 15+16' | bc)echo "binary of (15+16) is $r" # comparison for floating point numbers using 'bc'big=100small=99.9if [ $(echo "$big > $small" | bc) -eq 1 ]; then echo "$big is bigger than $small"fi # deal with floating point numbers with 'awk' languageecho $(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.shc=a+b=3.33+3.3=6.63d=a*b=3.33*3.3=10.98e=a/b=3.33/3.3=1.00909pi=3.1415926532s=sin(pi/6)=.49999999994373819220binary of (15+16) is 11111100 is bigger than 99.910/2.5=4.00100 / 99.9 = 1.00100100100.000000 > 99.900000master@jay-linux:~/workspace/mygit/shell/sh2012$ cat temp.bc3+83/8scale=2; 3/8 master@jay-linux:~/workspace/mygit/shell/sh2012$ bc -q temp.bc110.37
[root@250-shiyan sh]# bash let
2.22[root@250-shiyan sh]# cat letvar=2i=`echo "scale=2;$var*1.11"|bc`echo $ishell程序中的操作默认都是字符串操作在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=1var=`echo "scale=1;$var*2.0"|bc` bc预设输出整数,用scale 指定小数点下位数echo $varoutput:2.0bc支持除位运算以外的所有运算。另外一个支持浮点运算的方法是awk:var=1var=`echo "$var 1"|awk '{printf("%g",$1+$2)}'`echo $varoutput:2$ c=$(awk 'BEGIN{print 7.01*5-4.01 }')$ echo $c1:在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 $r3:使用 $[ ]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=10let n=n+1echo $n #n=11乘法:let m=n*10echo $m除法:let r=m/10echo $r求余数:let r=m%7echo $r乘冪:let r=m**2echo $r虽然Bash shell 有四种算术运算方法,但并不是每一种都是跨平台的,建议使用expr。另外,我们在 script 中经常有加1操作,以下四法皆可:m=$[ m + 1]m=`expr $m + 1`m=$(($m + 1))let m=m+1