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