Shell脚本中数值都是默认按照十进制处理的,除非这个数值做了特殊标记,如:以 0 开头就是 8 进制数,以0x 开头就是16 进制数。
1. 二进制、八进制、十六进制等转化为十进制
另外 BASE#NUMBER 这种形式可以表示其它进制,BASE值:2 ~ 64。
1 2 3 4 5 6 7 8 9 10 |
((num=0xff)); echo $num 255 ((num=0123)); echo $num 83 echo $((0123)) 83 ((num=8#123)); echo $num 83 ((num=64#123)); echo $num 4227 |
2. 使用bc工具来进行进制转换
我的经验是:一般先设置obase,再设置ibase,这样的话obase/ibase都可以按照默认的十进制来设置;否则先设置的ibase会对后面设置的obase参数生效(这个要注意)。
ibase 设置 input base,必须是 2 ~ 16 之间的数字;对于十六进制,ABCDEF等字母要大写。
obase 设置 output base,2-16进制就用普通的表示方法,如果大于16,则用多个字符来表示一个数字,数字之间用空格间隔。
1 2 3 4 5 6 7 8 |
Jay-Ali:~ jay$ echo "obase=16; ibase=10; 100" | bc 64 Jay-Ali:~ jay$ echo "obase=2; ibase=10; 100" | bc 1100100 Jay-Ali:~ jay$ echo "obase=16; ibase=2; 111111" | bc 3F Jay-Ali:~ jay$ echo "obase=5; ibase=10; 100" | bc 400 |
3. 使用printf来进行8、10、16进制的转化
printf也是可以用来进行简单的进制转换的;它不支持输出二进制。
1 2 3 4 5 6 7 8 9 10 11 12 |
Jay-Ali:~ jay$ printf %d 100 100 Jay-Ali:~ jay$ printf %o 100 144 Jay-Ali:~ jay$ printf %x 100 64 Jay-Ali:~ jay$ printf %d 0x64 100 Jay-Ali:~ jay$ printf %d 0144 100 Jay-Ali:~ jay$ printf %X 255 FF |