数字常量
shell脚本在默认情况下都是把数字作为10进制数来处理, 除非这个数字采用了特殊的标记或者前缀. 如果数字以0开头的话那么就是8进制数. 如果数字以0x开头的话那么就是16进制数. 如果数字中间嵌入了#的话, 那么就被认为是BASE#NUMBER形式的标记法(有范围和符号限制).
下面根据具体的实例对这几种表示方法进行深入分析:
#!/bin/bash
let "dec = 32"
echo "decimal number = $dec"
let "oct = 032"
echo "octal number = $oct"
let "hex = 0x32"
echo "hexadecimal number = $hex"
let "bin = 2#1101"
echo "banary number = $bin"
let "b32 = 32#77"
echo "base-32 number = $b32"
let "b64 =64#@_"
echo "base-64 number = $b64"
exit 0
结果:
root@ubuntu:~/resource/shell-study/0506-2013# ./test6.sh
decimal number = 32
octal number = 26
hexadecimal number = 50
banary number = 13
base-32 number = 231
base-64 number = 4031
分析:
1.第一个没有添加如何描述,默认为十进制,32即32
2.这个数据添加了特殊的前缀“0”,是八进制,032即表示八进制的32,换算的十进制即(3*8的1次方+2*8的0次方),也就是十进制的24+2=26
3.这个数据添加了特殊的前缀“0x”,是十六进制,0x32即表示十六进制的32,换算的十进制即(3*16的1次方+2*16的0次方),也就是十进制的48+2=50
4.这个数据是BASE#NUMBER形式,BASE=2,NUMBER=1101,其实就是二进制的意思,1101即表示二进制的1101,换算的十进制即(1*2的3次方+1*2的2次方+0*2的1次方+1*2的0次方),也就是十进制的8+4+0+1=13
5.这个数据是BASE#NUMBER形式,BASE=32,NUMBER=77,其实就是三十二进制的意思,77即表示三十二进制的77,换算的十进制即(7*32的1次方+7*32的0次方),也就是十进制的224+7=231
5.这个数据是BASE#NUMBER形式,BASE=64,NUMBER=@_,其实就是六十四进制的意思,@_即表示三十二进制的@_,这里重点说明一下,在这个六十四进制中每组包括64位,即0-63,0-9即用0-9表示,但是后面的数字都是两位数,所以shell就给出了一种简单的方法来取代这些两位数,10-35这26个位就依次用26个小写字母表示(依次为a-z),36-61这26个位就依次用26个大写字母表示(依次为A-Z),最后还剩下62和63这两个位,聪明的shell于是就用“@”表示62,用“_”表示62,所以也就有了上面的方法了,所以换算成十进制就是62*64的1次方+63*64的0次方,即3968+63=4031
重要的注意事项:
使用一个超出给定进制的数字的话,,将会引起一个错误.
root@ubuntu:~/resource/shell-study/0506-2013# let "val = 081"
bash: let: val = 081: value too great for base (error token is "081")
提示数值过大,即八进制每位的最大值是7,而上面第二位却是8,所以提示错误
到现在看来,其实用八进制,十六进制完全可以不在使用“0”“0x”来表示了,完全可以全部用BASE#NUMBER形式取代,下面做一个下测试验证:
root@ubuntu:~/resource/shell-study/0506-2013# let "val = 8#32"
root@ubuntu:~/resource/shell-study/0506-2013# echo $val
26
root@ubuntu:~/resource/shell-study/0506-2013# let "val = 16#32"
root@ubuntu:~/resource/shell-study/0506-2013# echo $val
50
root@ubuntu:~/resource/shell-study/0506-2013#
结果和上面的结果是一致的
待续。。。。。。