天天看點

算術運算

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

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))))

(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

64

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

512

[root@desktop7 ~]# r=$((m<<6))   #16-->32-->64-->128-->256-->512-->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

169

(3)前置式遞增

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

170

(4)後置式遞減

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

(5)前置式遞減

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

168                               #變量i一直在運算

4、指派運算

加法

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

[root@desktop7 ~]# ((i+=60))   #i+=60等同于i=$i+60,即i加上60後,把運算結果再指派給i即

229

減法

[root@desktop7 ~]# ((i-=60))   #i-=60等同于i=$i-60,即i減去60後,把運算結果再指派給i

[root@desktop7 ~]# ((i-=60))   #繼續操作,驗證

109

乘法

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

218

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

654

除法

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

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

取餘數,用于驗證奇數、偶數的行與列等

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

9

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

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

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

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

左移

[root@desktop7 ~]# ((i=32))    #對i指派32

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

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

右移

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

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

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也可以調整,但是效果不好,在此隻是說明調整方法)

  4 a=${1:-255}

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

  6 bamp=

  8 printf "%-s\n" "1的位數 128  64  32  16  8  4  2  1"  #将echo換為printf,%-s為左對齊,單獨%預設右對齊

  9 for i in $mask

 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