高级Bash脚本编程指南(9):数字常量

高级Bash脚本编程指南(9):数字常量

成于坚持,败于止步

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# 
结果和上面的结果是一致的

先到这里了,O(∩_∩)O~

我的专栏地址:http://blog.csdn.net/column/details/shell-daily-study.html

待续。。。。。。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值