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