zoukankan      html  css  js  c++  java
  • 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 ",x/y}') v=$(echo $big $small | awk '{ printf "%0.8f " ,$1/$2}') echo "$big / $small = $v" echo $big $small | awk '{if($1>$2) {printf"%f > %f ",$1,$2} else {printf"%f <%f ",$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

  • 相关阅读:
    2018.5.27 OraclePLSQL编程 if-else练习和循环结构练习
    桶排序
    从函数中返回引用
    函数返回值
    参数传递模式
    计数排序(不基于比较的排序算法)
    快排序
    堆用作优先队列
    堆排序
    合并算法
  • 原文地址:https://www.cnblogs.com/createyuan/p/4193167.html
Copyright © 2011-2022 走看看