算术运算

2013年3月25日 星期一 晴  2013年3月30日星期六整理


算术运算


1、加法运算


(1)未给变量赋值


[root@desktop7 ~]# echo $((${r:8}+2))      #变量书写错误           


2


区别于


[root@desktop7 ~]# echo $((${r:-8}+2))


10


变量不存在或空值,变量值为空


(2)给变量赋值


[root@desktop7 ~]# r=3


[root@desktop7 ~]# echo $((${r:-8}+2))


5


2、简单运算(加法、减法、乘法、除法、乘方、求余数等,递增递减详见下一篇文章)


(1)两步走与复杂表达


[root@desktop7 ~]# r=$((6+5))


[root@desktop7 ~]# echo $r


11


[root@desktop7 ~]# echo $(($((9-5))))


4


[root@desktop7 ~]# echo $(($((9*5))))


45


[root@desktop7 ~]# echo $(($((25/5))))


5


(2)简单表达


[root@desktop7 ~]# echo $((5*8))


40


[root@desktop7 ~]# echo $((2**8))              #平方


256


[root@desktop7 ~]# echo $((2**10))


1024


[root@desktop7 ~]# echo $((2**11))


2048


[root@desktop7 ~]# echo $((2**12))


4096


以下两个算术运算在LINUX中暂时不支持,手工组合


[root@desktop7 ~]# echo $((1.01**365))


37.783434333


[root@desktop7 ~]# echo $((0.99**365))


0.025517964


寓意:每天进步一点点,你可一年变富帅; 每天退步一点点,富美一年变挫矮


(3)位左移(应用较少)


[root@desktop7 ~]# m=16


[root@desktop7 ~]# r=$((m<<1))   #以二进制方式左移一位,等于把值放大一倍,等同于进制转换时128_64_32_16_8_4_2_1的移动


[root@desktop7 ~]# echo $r       #16-->32


32


[root@desktop7 ~]# r=$((m<<2))   #16-->32-->64


[root@desktop7 ~]# echo $r


64


[root@desktop7 ~]# r=$((m<<5))   #16-->32-->64-->128-->256-->512


[root@desktop7 ~]# echo $r


512


[root@desktop7 ~]# r=$((m<<6))   #16-->32-->64-->128-->256-->512-->1024


[root@desktop7 ~]# echo $r


1024


(4)位右移


[root@desktop7 ~]# m=32


[root@desktop7 ~]# r=$((m>>2))    #以二进制方式右移两位,等于把值缩小两倍


[root@desktop7 ~]# echo $r        #32-->16-->8


8


[root@desktop7 ~]# r=$((m>>1))    #以二进制方式右移一位,等于把值缩小一倍


[root@desktop7 ~]# echo $r        #32-->16


16


3、对变量本身做单元的算术运算(())


(1)指定运算


[root@desktop7 ~]# ((i=168))


[root@desktop7 ~]# echo $i


168


(2)后置式递增


[root@desktop7 ~]# ((i++))        #i=$i+1-->即168+1


[root@desktop7 ~]# echo $i


169


(3)前置式递增


[root@desktop7 ~]# ((++i))        #i=$i+1-->即169+1


[root@desktop7 ~]# echo $i


170


(4)后置式递减


[root@desktop7 ~]# ((--i))        #i=$i-1-->即170-1


[root@desktop7 ~]# echo $i


169


(5)前置式递减


[root@desktop7 ~]# ((i--))        #i=$i-1-->即169-1


[root@desktop7 ~]# echo $i


168                               #变量i一直在运算


4、赋值运算


加法


[root@desktop3 ~]# ((i=169))   #给i初始值169


[root@desktop7 ~]# ((i+=60))   #i+=60等同于i=$i+60,即i加上60后,把运算结果再赋值给i即


[root@desktop7 ~]# echo $i


229


减法


[root@desktop7 ~]# ((i-=60))   #i-=60等同于i=$i-60,即i减去60后,把运算结果再赋值给i


[root@desktop7 ~]# echo $i


169


[root@desktop7 ~]# ((i-=60))   #继续操作,验证


[root@desktop7 ~]# echo $i


109


乘法


[root@desktop7 ~]# ((i*=2))    #i*=2等同于i=$i*2,在此即为109*2


[root@desktop7 ~]# echo $i


218


[root@desktop7 ~]# ((i*=3))    #i*=3等同于i=$i*3,在此即为218*3


[root@desktop7 ~]# echo $i


654


除法


[root@desktop7 ~]# ((i/=3))    #i/=3等同于i=$i/3,在此即为654/3


[root@desktop7 ~]# echo $i


218


[root@desktop7 ~]# ((i/=2))


[root@desktop7 ~]# echo $i


109


取余数,用于验证奇数、偶数的行与列等


[root@desktop7 ~]# ((i%=100))  #i%=100等同于i=$i/100取余数,在此即为109/100取余数9


[root@desktop7 ~]# echo $i


9


[root@desktop7 ~]# ((i%=10))   #i%=10等同于i=$i/10取余数,在此即为9/10取余数9


[root@desktop7 ~]# echo $i


9


[root@desktop7 ~]# ((i%=5))    #i%=5等同于i=$i/5取余数,在此即为9/5取余数4


[root@desktop7 ~]# echo $i


4


[root@desktop7 ~]# ((i%=9))    #i%=9等同于i=$i/9取余数,在此即为4/9取余数4


[root@desktop7 ~]# echo $i


4


[root@desktop7 ~]# ((i%=4))    #i%=4等同于i=$i/4取余数,在此即为4/4取余数0


[root@desktop7 ~]# echo $i


0


左移


[root@desktop7 ~]# ((i=32))    #对i赋值32


[root@desktop7 ~]# ((i<<=1))   #i<<=1即位左移一位


[root@desktop7 ~]# echo $i


64


[root@desktop7 ~]# ((i<<=2))


[root@desktop7 ~]# echo $i


256


右移


[root@desktop7 ~]# ((i>>=2))   #i>>=2即位右移两位


[root@desktop7 ~]# echo $i


64


[root@desktop7 ~]# ((i>>=2))


[root@desktop7 ~]# echo $i


16


5、三元表达式


[root@desktop7 ~]# i=168


[root@desktop7 ~]# ((n=i<100?50:80))


如果变量i的值小于100,则传回50,否则传回80


[root@desktop7 ~]# echo $n


80


[root@desktop7 ~]# vim netmask_2_bits.sh


  1 #!/bin/bash


  2


  3 declare -i a i q s=0


  4 a=${1:-255}                        #变量a的范围为1~255


  5 mask="128 64 32 16 8 4 2 1"        #变量mask赋予整体变量“128~1”即2的0到7次幂值


  6 Bamp=                              #Bamp存放a化成二进制数后的字符串图标(第14行)


  7


  8 echo "1的位数 128 64 32 16 8 4 2 1" #显示此行内容


  9 for i in $mask                     #变量i循环于变量mask


 10 do


 11


 12    q=$((a/i))                      #q的取值为所给值a(a也变化15行定义)除以2的0到7次幂值,只为1或0


 13    ((s+=q))                        #变量s为q(即数字1)的累加


 14    [ $q -gt 0 ] && Bmap=$Bmap"_1_" || Bmap=$Bmap"_0_"  #据条件则显示内容,否则显示其他内容


 15    a=$((a-q*i))                    #定义变量a的值,即初始值减去已运算的值,举例如下


 16 done


 17


 18 echo " $s : $Bmap"


其中第15行,如a初始值为223;先除以128,此时q为1;显示_1_.a值改变为223减去1乘以128即为95,再循环.95除以128,为0,显示_0_,a不变,再循环。95除以64......


[root@desktop7 ~]# chmod a+x netmask_2_bits.sh


[root@desktop7 ~]# ./netmask_2_bits.sh 218         #举例218,查看结果


1的位数 128 64 32 16 8 4 2 1


 5 : _1__1__0__1__1__0__1__0_


调整之后,也不完美(2的幂次可以调整,Bmap也可以调整,但是效果不好,在此只是说明调整方法)


[root@desktop7 ~]# vim netmask_2_bits.sh


  1 #!/bin/bash


  2


  3 declare -i a i q s=0


  4 a=${1:-255}


  5 mask="128 64 32 16 8 4 2 1"


  6 Bamp=


  7


  8 printf "%-s\n" "1的位数 128  64  32  16  8  4  2  1"  #将echo换为printf,%-s为左对齐,单独%默认右对齐


  9 for i in $mask


 10 do


 11


 12    q=$((a/i))


 13    ((s+=q))


 14    [ $q -gt 0 ] && Bmap=$Bmap"1  " || Bmap=$Bmap"0  " #数字1和0后面都加空格


 15


 16    a=$((a-q*i))


 17 done


 18


 19 printf "%+s\n" "$s    :   $Bmap"                      #显示时也调整,变量s后变量Bmap前加空格


[root@desktop7 ~]# ./netmask_2_bits.sh 218


1的位数 128  64  32  16  8  4  2  1


5    :   1  1  0  1  1  0  1  0  


你可能感兴趣的:(算数运算,进制转换脚本)